2016-01-20 40 views
1

在我的UIView的名为“courseView”的顶部,我有一个名为“展开按钮”的栏按钮的工具栏。当我按下该按钮时,expandCourseView()被调用并且视图框架正确动画。然而,在动画完成后,我想用“expandButton”来改变文字。当它这样做时,视图的框架将自动恢复到原始形状。为什么会发生?看起来好像工具栏上的按钮没有注册其位置已经移动。当UIBarButton被按下时,UIView快速返回到原始框架

@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()),您需要修改约束以将视图保留在新的位置。

+0

“courseView”的唯一约束是它必须在视图控制器中居中,并且视图控制器必须具有相同的宽度。通过在我的代码中改变框架的方式,它不应该违反任何这些约束。它没有指定的高度,也没有到任何其他视图的距离。 – Lahav

+0

如果您使用自动布局,则必须有足够的约束来描述视图的位置。你不能这样做的一部分。如果你这样做,你会在调试控制台中看到警告。如果你看到这些,你就有更多的工作要做。 –