2014-12-05 178 views
3

我必須在多個「切換」控件的iPhone屏幕上顯示彈出窗口。並分別使用開關打開/關閉動作在彈出視圖上添加和刪除子視圖。爲了更好地說明情況,請參閱下面的使用自動佈局動態添加子視圖時調整超級視圖

圖像。 Initial popover

當用戶點擊按鈕時,上面的彈出視圖首先出現。彈出窗口必須始終保持在屏幕的中心,最初添加的觸點開關將處於關閉狀態。打開時,必須將下面的子視圖添加到彈出窗口中,同時將彈出窗口保留在屏幕中央,並按照子視圖增加彈出窗口的高度。 Add contact switch "ON"

就像上面那樣,當「添加郵件」開關將會「打開」時,彈出窗口視圖必須再次增加兩個子視圖的高度。最後這個樣子,

Final popoverView

就是這樣。我通過我的應用程序使用自動佈局,這是我困惑的地方。我知道我可以每次刪除這些餡餅和一個新的,但這似乎是一種新手選擇。那麼是否有任何簡單的方法來添加子視圖並使用自動佈局動態擴展它的超級視圖?我看到很多UILabel的問題,並且關於它的內在內容大小,但仍然無法理解這種特殊情況。任何幫助將不勝感激。快樂的編碼。

+0

在原始情況下,您的約束條件如何? – 2014-12-05 13:44:41

+0

目前我還沒有設置任何約束條件,因爲我無法清楚地知道如何做到這一點,因爲您看到我必須動態添加子視圖,所以我不知道如何使用自動佈局來實現。正如它所說,即使我隱藏了子視圖,那麼它也會在計算子視圖時發揮約束作用。 – 2014-12-05 13:58:32

+0

請在下面查看我的答案,瞭解如何使用佈局約束來實現您的目標。 – 2014-12-06 18:04:32

回答

0

您可以對視圖的出口高度進行約束,然後將相應的值設置爲元素。

+0

您的意思是我必須爲所有子視圖以及容器彈出窗口視圖採用高度約束IBOutlets,並動態更改它們,首先將子視圖的約束條件保留爲「零」,這不是必需的,然後在需要顯示時更改它們並用一些小的擴展動畫改變容器視圖高度約束? – 2014-12-05 14:01:19

+0

是的。 你不需要3個子視圖,你只能用一個子視圖來完成。隱藏文本框,然後操作textField.hidden = NO並設置_heightCOnstraint = 60.00; – mokiSRB 2014-12-05 14:55:46

+0

好的。得到它了。謝謝。 – 2014-12-06 05:21:53

4

這可以用普通佈局約束來實現,而不必手動約束容器視圖的高度,然後更新該約束的常量。

做到這一點的方法是根據底部最底層的子視圖的底部約束容器視圖的高度。

conatiner constraints

然後把一個參照此約束您的視圖控制器內。

constraint reference

現在你可以寫類似下面的視圖控制器,這將在容器視圖的底部添加一個新的子視圖,並自動更新容器視圖的高度。

#import "ViewController.h" 

@interface ViewController() 

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint; 
@property (weak, nonatomic) IBOutlet UIButton *addButton; 
@property (weak, nonatomic) IBOutlet UIView *containerView; 
@property (nonatomic, weak) UIView *lastView; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.lastView = self.addButton; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)addButtonTapped:(id)sender { 
    UIView *newView = [[UIView alloc] initWithFrame:CGRectZero]; 
    newView.translatesAutoresizingMaskIntoConstraints = NO; 
    newView.backgroundColor = [UIColor redColor]; 
    [newView addConstraint:[NSLayoutConstraint constraintWithItem:newView 
                 attribute:NSLayoutAttributeHeight 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0 
                 constant:35]]; 

    [self.containerView addSubview:newView]; 
    [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastView]-(14)-[newView]" 
                    options:NSLayoutFormatAlignAllCenterX 
                    metrics:nil 
                     views:@{@"lastView" : self.lastView, @"newView" : newView}]]; 
    [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[newView]-(10)-|" 
                    options:NSLayoutFormatAlignmentMask 
                    metrics:nil 
                     views:@{@"newView":newView}]]; 

    [self.containerView removeConstraint:self.bottomConstraint]; 
    self.bottomConstraint = [NSLayoutConstraint constraintWithItem:self.containerView 
                 attribute:NSLayoutAttributeBottom 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:newView 
                 attribute:NSLayoutAttributeBottom 
                 multiplier:1.0 
                  constant:14]; 
    [self.containerView addConstraint:self.bottomConstraint]; 

    self.lastView = newView; 
} 
@end 

加上這一切,你應該得到以下行爲。

enter image description here

相關問題