iOS:UIView 在动画时改变大小,我该如何防止?

Posted

技术标签:

【中文标题】iOS:UIView 在动画时改变大小,我该如何防止?【英文标题】:iOS: UIView changes size when animating, how do I prevent that? 【发布时间】: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

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

【问题讨论】:

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

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

【讨论】:

以上是关于iOS:UIView 在动画时改变大小,我该如何防止?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发UIView的动画与嵌入的UIButton的问题

ios uiview封装动画(摘录)

ios之UIview动画

iOS开发UI篇—核心动画(UIView封装动画)

iOS开发UI篇—核心动画(UIView封装动画)

iOS UIView drawRect 调整大小动画