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 在动画时改变大小,我该如何防止?的主要内容,如果未能解决你的问题,请参考以下文章