想要在一个imageView swift上限制平移手势的区域5



我有一个imageview有2个gesturerecognizer1)捏2)锅

我能够捏图像和缩放使用缩放属性我无法实现的是,当我缩放该图像并拖动到所有4边时,我可以拖动图像,并且我能够看到imageview背后的背景视图想要限制imageview的拖动,直到缩放后的图像显示

这里是缩放和平移手势的代码

@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点。

当水平拖动时我们想要在拖动视图位于父视图的左边缘或右边缘时停止。

  • 计算最大中心x位置
    • 将是拖放视图宽度的1/2
  • 计算最小中心x位置
    • 将是width-of- superview减去拖曳视图宽度的1/2

例如,如果父视图的宽度为100,拖放视图的宽度为200,则最大中心x为100,最小中心x为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
}
}

编辑

为了防止缩放手势将视图缩放到小于其父视图帧,我们可以将新的缩放值从手势应用到视图CGRect

然后,只有当结果矩形不小于父视图的框架时,才对视图应用缩放。

试一试:

@objc func pinchRecognized(pinch: UIPinchGestureRecognizer) {
// unwrap the view from the gesture
// AND
// unwrap that view's superView
guard let piece = pinch.view,
let superV = piece.superview
else {
return
}
// this is a bit verbose for clarity

// get the new scale
let sc = pinch.scale

// get current frame of "piece" view
let currentPieceRect = piece.frame

// apply scaling transform to the rect
let futureRect = currentPieceRect.applying(CGAffineTransform(scaleX: sc, y: sc))

// if the resulting rect's width will be
//  greater-than-or-equal to superView's width
if futureRect.width >= superV.bounds.width {
// go ahead and scale the piece view
piece.transform = piece.transform.scaledBy(x: sc, y: sc)
}
pinch.scale = 1

}

最新更新