2015-09-07 37 views
1

我一直堅持這個問題相當長一段時間了。在Objective-C中開發iOS應用程序時,如何在啓用Autolayout時以編程方式更改UIViews的位置(位置)?它是如此不容易,因爲自動佈局我們剛纔指定的UIView作爲這樣一個新的中心:如何以編程方式更改UIViews在Autolayout打開時的位置

UIView.center = CGPointMake(x,y); 

然而,以上不再起作用,因爲自動佈局的。最終,我試圖通過使用從左到右的轉換轉換來爲某個UIView設置動畫。爲了做到這一點,我需要以編程方式移動UIViews,目前我無法做到這一點。下面的是什麼,我想基本上是做(但它不會因爲自動佈局的工作):

_loginTextLabel.center = CGPointMake(1,1); 

[UIView animateWithDuration:0.5 delay:0.5 options:nil animations:^{ 
    _loginTextLabel.center= CGPointMake(5, 1); 

} completion:nil 
]; 
} 
+0

在這篇文章中有幾個有趣的想法:http://stackoverflow.com/questions/11368440/can-i-disable-autolayout-for-a-specific-subview-at-runtime一個簡單的地方開始,嘗試在設置新中心之前設置'translatesAutoresizingMaskIntoConstraints = YES'。 –

+0

@WilliamSmith另外一個問題。爲什麼當我使用它時,「CGPointMake(_loginTextLabel.bounds.origin.x,_loginTextLabel.bounds.origin.y)」會生成一個(0,0)值?這是不對的。這也是一個自動佈局問題? – Vimzy

+0

我猜首先我會問,你爲什麼認爲它錯了? bounds屬性定義了UIView相對於框架的可繪製區域。它通常默認爲(0,0,寬度,高度)。從Apple文檔中獲得「邊界矩形的大小與幀矩形的大小相關聯,以便更改一個影響另一個。更改邊界大小會相對於其中心點增大或縮小視圖。」你可以在這裏閱讀bounds屬性:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instp/UIView/bounds –

回答

1

其實你可以佈局- (void)viewDidLayoutSubviews您_loginTextLabel(或- (void)layoutSubviews如果它在你的自定義視圖),而自動版式,然後像你沒有任何打擾以前那樣能夠繪製你的看法。

如果佈局使用自動佈局從筆尖,那麼作爲阿布舍克說,你可以創建約束的網點您的看法,基本上是這樣的:

[self.view layoutIfNeeded]; 
yourConstraint.constant = whateverYouWant; 
[UIView animateWithDuration:1.0 animations:^{ 
    [containerView layoutIfNeeded]; } 
]; 

或者如果編程創建您的約束,如蘋果建議:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutolayoutPG.pdf

它基本上就像你從筆尖一樣,不同的是,你只要把你的約束條件變化的動畫塊

[containerView layoutIfNeeded]; 
[UIView animateWithDuration:1.0 animations:^{ 
// Make all constraint changes here 
[containerView layoutIfNeeded]; // Forces the layout of the subtree animation 
block and then captures all of the frame changes 
}]; 
+1

你能解釋我實際上應該使用這一行:「yourConstraint.constant = whateverYouWant;」它的用途是什麼? – Vimzy

+0

@Vimzy假設你有一個按鈕,並且你爲它的超級視圖創建了一個引導約束的出口,其固定值如10,如下所示:@property(weak,nonatomic)IBOutlet NSLayoutConstraint * leadingConstraint;當你水平移動你的按鈕時,你可以將你的約束的值從10更改爲你想要的任何其他值,所以給它一個新的值,如:self.leadingConstraint.constant = 100; – John

0

爲了處理程序自動版式,您需要創建約束的IBOutlets,他們是一流的NSLayoutConstraints,以及您想要更改位置或框架的位置,您需要在視圖上調用updateConstraintsIfNeeded。然後,您需要將Float值設置爲插座的Constant屬性。

_constraintHeight.constant = 200;

相關問題