我在视图控制器中有一个子视图,我在其中添加了UIPanGestureRecognizer
。我想在用户向下拖动时展开这样的子视图,所以我尝试像这样处理手势识别器状态:
@objc func panning(_ gestureRecognizer: UIPanGestureRecognizer) {
let translation = gestureRecognizer.translation(in: view)
if gestureRecognizer.state == .began {
originalFrame = self.mySubview.frame
} else if gestureRecognizer.state == .changed {
if translation.y > 0 {
var newFrame = originalFrame
newFrame.size.height += translation.y
mySubview.frame = newFrame
}
}
}
当我在mySubview.frame = newFrame
处设置断点时,我看到newFrame
已使用翻译进行更新。但是,我在屏幕上看不到帧更改,子视图看起来总是像开始时一样。
我可能缺少什么?
PanGesture是一个棘手的问题,但使用它非常有趣......
我假设您已将平移手势正确添加到视图中。所以只写下手势的处理。
func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
var translatedPoint: CGPoint = gesture.translation(in: self.superview)
let playerCenterX: CGFloat = (gesture.view?.center.x)! + translatedPoint.x
let playerCenterY: CGFloat = (gesture.view?.center.y)! + translatedPoint.y
translatedPoint = CGPoint.init(x: playerCenterX,
y: playerCenterY)
gesture.view?.center = translatedPoint
gesture.setTranslation(CGPoint.zero, in: self.superview)
}
重要的是,每次手势移动结束时都要将其平移设置回零。
根据您的要求更改此self.superview
并使用坐标更新您的视图框...
如果视图的框架是由自动布局设置的,则应更新约束,而不是视图的框架本身。