【问题标题】:iOS: UIView changes size when animating, how do I prevent that?iOS:UIView 在动画时改变大小,我该如何防止?
【发布时间】:2019-01-10 14:26:34
【问题描述】:

我在我的 xcode 项目中遇到了一些问题,当我拖动 UIView 时它的大小会发生变化。请看这个 GIF,你就会明白我的意思了:

UIView Resizing on drag

我正在使用 panGestureRecognizer 对其进行动画处理。我已经为 x 和 y 手势设置了一大堆动画,问题似乎出现在手势处理程序的 .changed 方法中(请原谅我在这里不知道正确的术语,对此仍然很陌生)

动画效果很好,只是在我执行 .changed 动画时似乎会调整大小的 dialogView(模态)。

所以这是我在拖动时用于为 dialogView 设置动画的代码:

if gesture.state == .changed {
        if velocity.x > 100 {
            UIView.animate(withDuration: 0.3, animations: {
                self.dialogView.transform = CGAffineTransform(rotationAngle: 50)
            }) { (completed) in
            }
        }

        if velocity.x < -50 {
            UIView.animate(withDuration: 0.3, animations: {
                self.dialogView.transform = CGAffineTransform(rotationAngle: -50)
            }) { (completed) in
            }
        }
    }

它会旋转,我很高兴我可以让它工作。

仅作为上下文,这是我将所有动画放入的手势函数的开头:

@objc func panGestureRecognizerAction(_ gesture: UIPanGestureRecognizer) {
    let translation = gesture.translation(in: view)
    let velocity = gesture.velocity(in: view)

    view.frame.origin = translation

dialogVIew 是一个带有垂直堆栈视图的 UIView。 (模式视图控制器故事板的屏幕截图。

Task Detail View Controller Storyboard

我在这里遗漏了什么?非常感谢任何建议。

【问题讨论】:

  • 哦,请注意,稍后我将在动画完成方面做一些事情,这就是为什么现在这些是空的。
  • 额外的空间用于“早安”段落的上方和下方。我们需要查看所有影响布局的代码:自动布局约束和任何手动操作。另外,请参阅:stackoverflow.com/questions/48747666/…,其中提到:“当 [transform] 的值不是身份转换时,frame property 中的值未定义,应被忽略”
  • 如果dialogView是按照frame初始化的,所有代码看起来都很好。但是,如果 dialogView 受自动布局约束,请在 IB 中显示约束。这就是导致动画期间实际尺寸的问题。
  • 感谢您的回复@BaseZen,我现在将通过此链接,谢谢。为了回答您的其他问题,我在 stackview 上有 4 个自动布局约束,对话框视图中的常量为 20。 DimView 的约束,即淡入/淡出的背景,在父视图中全部设置为 0。 dialogView 从超级视图顶部和底部开始为 100,从左右开始为 15。我将在此评论下方粘贴代码
  • 抱歉,我是 stackexchange 的新用户,无法在此评论中粘贴所有代码。这是一个粘贴箱,请注意,我确实将这些约束链接到 IB 网点,但尚未使用它。 pastebin.com/EVCqHKfh

标签: ios swift


【解决方案1】:

我发现了问题。似乎将对话框视图顶部的自动布局约束设置为安全区域是问题所在。我改为相对于 superview 并解决了这个问题。感谢@E.coms 和@BaseZen 指出自动布局一定是问题所在。现在我将它设置为相对于视图而不是安全区域,它可以完美运行。非常感谢。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2019-07-16
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多