Ios UIView&x27;s帧未显示,已使用UIPangestureRecognitor更新

Ios UIView&x27;s帧未显示,已使用UIPangestureRecognitor更新,ios,swift3,uiview,frame,uipangesturerecognizer,Ios,Swift3,Uiview,Frame,Uipangesturerecognizer,我在viewController中有一个子视图,我在其中添加了一个UIPangestureRecognitor。我想在用户拖动子视图时展开该子视图,因此我尝试如下处理手势识别器状态: @objc func panning(_ gestureRecognizer: UIPanGestureRecognizer) { let translation = gestureRecognizer.translation(in: view) if gestureRecognizer.stat

我在viewController中有一个子视图,我在其中添加了一个
UIPangestureRecognitor
。我想在用户拖动子视图时展开该子视图,因此我尝试如下处理手势识别器状态:

@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
,并使用坐标更新您的图幅