在iOS上实现缩放的算法其实很简单
func pinchGestureRecognized(sender: UIPinchGestureRecognizer) {
let offset: CGFloat = sender.scale < 1 ? 5.0 : -5.0
let oldFrame = l.frame
let oldOrigin = oldFrame.origin
let newOrigin = CGPoint(x: oldOrigin.x + offset, y: oldOrigin.y + offset)
let newSize = CGSize(width: oldFrame.width + (offset * -2.0), height: oldFrame.height + (offset * -2.0))
let newFrame = CGRect(origin: newOrigin, size: newSize)
if newFrame.width >= 100.0 && newFrame.width <= 300.0 {
l.borderWidth -= offset
l.cornerRadius += (offset / 2.0)
l.frame = newFrame
}
}
下面分别解释函数中的每一行代码:
- 确定偏移值:scale大于1表示缩小,scale小于1表示放大,每调用一次该函数,放大或缩小5
- l表示someView的layer,先获取缩放前layer的frame
- 获取缩放前frame的起始点
- 根据缩放值计算新的起始点,很简单的数学计算,就是在缩放前的起始点上加上(放大)或减去(缩小)缩放值(缩放值为正数,即5)
- 计算缩放后的frame宽高,也很简单,放大的话就是原来的宽高加上2倍缩放值,缩小的话就是原来的宽高减去2倍缩放值
- 使用缩放后的初始值和宽高得到新的frame
- 限定新的frame度只能在100到300之间
- 设置边框的宽度,放大的话就是原来的宽度加上缩放值,缩小的话就是原来的宽高减去缩放值,确保边框内的内容不变
- 更新边角,缩小即边角增加缩放值的二分之一,放大即边角减小缩放值的二分之一
10 将view的layer设置为新的frame
缩放完成