2014-12-11 103 views
3

我在視圖控制器中有幾個視圖,當檢測到向上滑動時向上移動,然後在檢測到向下滑動時向下移動。我通過使用CGRectOffset調整y原點來迫使視圖移動。我現在已經對IB的視圖應用了約束條件,我不確定最佳的方式來移動視圖,以便它們在iPhone 5,6和6+上處於正確的位置。帶約束的移動視圖

目前我在做這樣的事情:

[self.view layoutIfNeeded]; 

    self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant +338; 

    [UIView animateWithDuration:5 
        animations:^{ 
         [self.view layoutIfNeeded]; 
        }]; 

是更好地改變使用比例常數?所以對於上面的約束,而不是使用338,是否會更好地做到這一點:

self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant + (self.panView.frame.size.height/1.680); 

    //self.panView.frame.size.height = 568 
    //(568/1.680) = 338 
+0

拿上這個一看 - http://stackoverflow.com/questions/26667006/uiview-addsubview-auto-layout -not-working/26668575#26668575 – Kampai 2014-12-11 10:09:05

+0

@Brosef,請問您是如何實施滑動上/下手勢來移動您的視圖?我正在嘗試做類似的事情,但不知道從哪裏開始。謝謝 – Pangu 2014-12-22 09:09:02

+1

@Pangu我幾乎遵循了下面答案中的步驟。我創建了一個'IBOutlet'' NSLayoutConstraint'屬性,並將它連接到我想在界面構建器中調整的約束。然後當我需要移動我的視圖時,我改變了我的常量,像這樣'self.panFrameVerticalConstraint.constant = - (self.panedView.frame.size.height/1.68);'。在改變常量之前,我調用了'layoutIfNeeded'。在改變常量後,我再次調用'animateWithDuration'並在塊中再次調用'layoutIfNeeded',就像下面的答案一樣。 – Brosef 2014-12-22 21:10:47

回答

21

是的,當你改變常量沒有問題。這裏的事情是你必須適當地設置你的約束。

讓我們來看一個例子。

我在故事板中有一個UIView,我想改變它的寬度。它的默認寬度是1024

經過一些動畫之後,我們將其寬度更改爲900

按照以下步驟來實現這一目標:

  1. 選擇UIView中,我們要更新的約束。這裏我們需要更新width,所以我們將爲寬度添加一個約束。

enter image description here

  • 現在我們可以看到新的約束添加到UIView
  • enter image description here

  • 點擊該約束。它將顯示約束屬性。這裏我們現在想把寬度從1024減小到900,這樣在約束屬性改變關係屬性到小於或等於。同樣,如果您想從1024增加寬度,那麼關係將爲大於或等於
  • enter image description here

  • 現在對於NSLayoutConstraint創建IBOutlet變量,並將其與上述寬度約束連接。
  • 變量將看起來像:

    在Objective C:

    @property (weak, nonatomic) IBOutlet NSLayoutConstraint  *viewWidthConstraint; 
    

    在夫特:

    @IBOutlet weak var viewWidthConstraint : NSLayoutConstraint! 
    
  • 更改寬度常數:
  • 減少下面使用代碼不變:

    目標C:

    // Reduce width of view. 
    [UIView animateWithDuration:0.35f animations:^{ 
        self.viewWidthConstraint.constant = 900; 
        [self.view layoutIfNeeded]; 
    }]; 
    

    雨燕4.0:

    // Reduce width of view. 
    UIView.animate(withDuration: 0.35, animations: {() -> Void in 
        self.viewWidthConstraint.constant = 900 
        self.view.layoutIfNeeded() 
    }) 
    

    而且同樣,我們可以將其更改爲默認值:

    目標C:

    // Change to default width of view. 
    [UIView animateWithDuration:0.35f animations:^{ 
        self.viewWidthConstraint.constant = 1024; 
        [self.view layoutIfNeeded]; 
    }]; 
    

    雨燕4.0:

    // Change to the default width of view. 
    UIView.animate(withDuration: 0.35, animations: {() -> Void in 
        self.viewWidthConstraint.constant = 1024 
        self.view.layoutIfNeeded() 
    }) 
    
    +0

    這是非常有幫助的。你說你想把寬度從1024更改爲900,但爲什麼你將約束常數改爲705? – Brosef 2014-12-11 18:27:02

    +0

    這只是一個例子。在代碼中我有要求將寬度減少到705. – Kampai 2014-12-11 18:57:02

    +1

    很好的解釋。我很感激。 +1 – viral 2014-12-12 07:08:02