按下 UIBarButton 时,UIView 会快速恢复到原始帧

Posted

技术标签:

【中文标题】按下 UIBarButton 时,UIView 会快速恢复到原始帧【英文标题】:UIView snaps back to original frame when UIBarButton is pressed 【发布时间】:2016-01-20 03:55:13 【问题描述】:

在名为“courseView”的 UIView 顶部,我有一个带有名为“展开按钮”的条形按钮的工具栏。当我按下该按钮时,将调用 expandCourseView() 并且视图框架会正确设置动画。然而,在动画完成后,我想用“expandButton”来改变文本。当它执行此操作时,视图的框架会自动捕捉回其原始形状。为什么会这样?似乎工具栏上的按钮没有记录其位置已移动。

@IBOutlet weak var expandButton: UIBarButtonItem!

@IBAction func expandButton(sender: AnyObject) 
    expandCourseView()


func expandCourseView()
    let width = self.courseView.frame.width
    let height = self.courseView.frame.height
    let frameOffset : CGFloat = 200
    UIView.animateWithDuration(0.5, animations:  () -> Void in
        if (height < 211)
            self.courseView.frame = CGRect(x: self.courseView.frame.minX, y: self.courseView.frame.minY - frameOffset, width: width, height: height + frameOffset)
        
        else 
            self.courseView.frame = CGRect(x: self.courseView.frame.minX, y: self.courseView.frame.minY + frameOffset, width: width, height: height - frameOffset)
        
        )  (value: Bool) -> Void in
            if height < 211
                self.expandButton.title = "Close"
             else 
                self.expandButton.title = "Expand"
            
    

【问题讨论】:

【参考方案1】:

您可能正在使用自动布局。虽然您可以直接操作帧来为视图设置动画或移动视图,但在某些时候(例如设置标签的文本值)会调用 setNeedsLayout() 并导致视图恢复到约束指定的值。

您可以保持动画原样,但在完成时(或在updateConstraints())中,您需要修改约束以将视图保持在新位置。

【讨论】:

对“courseView”的唯一限制是它必须在视图控制器中居中,并且它必须与视图控制器具有相等的宽度。通过像我在代码中所做的那样更改 courseView 的框架,它不应该违反任何这些约束。它没有指定的高度,也没有与任何其他视图的距离。 如果你使用自动布局,你必须有足够的约束来描述视图的位置。你不能以这种方式只做一部分。如果这样做,您将在调试控制台中看到警告。如果您看到这些,说明您还有更多工作要做。

以上是关于按下 UIBarButton 时,UIView 会快速恢复到原始帧的主要内容,如果未能解决你的问题,请参考以下文章

调用 pushViewController 时,后退按钮会覆盖上一个 UIBarButton

如何在快速按下按钮时添加独立的 UIView?

按下导航栏中的后退按钮并弹出视图B后更新视图B后面的视图A.

UIMenu 不弹出

每次调用 Func 时都会重写 UIView

通过按下按钮更新 UIView