如何解决想要限制一个 imageView swift 5 上的平移手势区域
我有一个 imageview,它有 2 个gestureRecognizers 1)捏 2)平移
我可以使用缩放属性捏合图像和缩放 我无法实现的是,当我缩放该图像并拖动到所有 4 个边时,我可以拖动图像并且我能够看到图像视图后面的背景视图 想要限制图像视图的拖动,直到显示缩放图像
这是捏和平移手势的代码
@objc func pinchRecognized(pinch: UIPinchGestureRecognizer) {
if let view = pinch.view {
view.transform = view.transform.scaledBy(x: pinch.scale,y: pinch.scale)
pinch.scale = 1
}
}
@objc func PangestureMethod(gestureRecognizer: UIPanGestureRecognizer){
guard gestureRecognizer.view != nil else {return}
let piece = gestureRecognizer.view!
let translation = gestureRecognizer.translation(in: piece.superview)
if gestureRecognizer.state == .began {
self.initialCenter = piece.center
}
if gestureRecognizer.state != .cancelled {
let newCenter = CGPoint(x: initialCenter.x + translation.x,y: initialCenter.y + translation.y)
piece.center = newCenter
}
else {
piece.center = initialCenter
}
}
解决方法
首先,重置平移手势的平移(可能)更容易,因此我们正在计算相对运动:
if gestureRecognizer.state != .cancelled {
// translation will be + or - a small number of points
// do what's needed to move the view
// reset recognizer
gestureRecognizer.setTranslation(.zero,in: superV)
}
否则,假设您向右拖动(平移)300 点,但视图只能移动 20 点,然后它不会开始向左移动,直到您向左拖动 280 点。>
因此,当水平拖动时,我们希望在拖动视图位于其超级视图的左侧或右侧边缘时停止...
- 计算最大 centerX 位置
- 这将是拖动视图宽度的 1/2
- 计算最小 centerX 位置
- 这将是 superView 的宽度减去拖动视图宽度的 1/2
举个例子,如果superView的宽度是100
,而drag-view的宽度是200
,则MAX centerX将为100
,MIN centerX为{{1 }}。
然后我们对 centerY 位置做同样的事情。
尝试将其用作平移手势处理程序:
Zero
编辑
为了防止捏合手势将视图缩小到小于其超级视图框架,我们可以在应用之前将手势的新缩放值应用到视图框架的@objc func PangestureMethod(gestureRecognizer: UIPanGestureRecognizer){
// unwrap the view from the gesture
// AND
// unwrap that view's superView
guard let piece = gestureRecognizer.view,let superV = piece.superview
else {
return
}
let translation = gestureRecognizer.translation(in: superV)
if gestureRecognizer.state == .began {
self.initialCenter = piece.center
}
if gestureRecognizer.state != .cancelled {
// what the new centerX and centerY will be
var newX: CGFloat = piece.center.x + translation.x
var newY: CGFloat = piece.center.y + translation.y
// MAX centerX is 1/2 the width of the piece's frame
let mxX = piece.frame.width * 0.5
// MIN centerX is Width of superView minus 1/2 the width of the piece's frame
let mnX = superV.bounds.width - piece.frame.width * 0.5
// make sure new centerX is neither greater than MAX nor less than MIN
newX = max(min(newX,mxX),mnX)
// MAX centerY is 1/2 the height of the piece's frame
let mxY = piece.frame.height * 0.5
// MIN centerY is Height of superView minus 1/2 the height of the piece's frame
let mnY = superV.bounds.height - piece.frame.height * 0.5
// make sure new centerY is neither greater than MAX nor less than MIN
newY = max(min(newY,mxY),mnY)
// set the new center
piece.center = CGPoint(x: newX,y: newY)
// reset recognizer
gestureRecognizer.setTranslation(.zero,in: superV)
}
else {
piece.center = initialCenter
}
}
到视图中。
然后,如果生成的矩形不小于 superView 的框架,则仅将缩放应用于视图。
试试这个:
CGRect
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。