2016-01-20 35 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

如果您使用自動佈局,則必須有足夠的約束來描述視圖的位置。你不能這樣做的一部分。如果你這樣做,你會在調試控制檯中看到警告。如果你看到這些,你就有更多的工作要做。 –