我在viewController中有一个子视图,我添加了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
已更新为翻译。但是,我没有在屏幕上看到帧的变化,子视图看起来总是像开头一样。
我能错过什么?
答案 0 :(得分:2)
PanGesture很棘手,但使用它非常有趣......
我假设你已经正确地将pan手势添加到视图中。所以只记下手势的处理。
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
并使用坐标更新您的视图框架
答案 1 :(得分:0)
如果你的视图的框架是由自动布局设置的,你应该更新约束,而不是视图的框架本身。