2014-01-08 62 views
0

的Xcode Interface Builder的問題
一個UIView我個人不喜歡這個界面生成器在Xcode的工作方式。在這個例子中,我試圖創建一個相當複雜的視圖控制器。在視圖控制器的viewDidLoad上,我顯示了一個自定義警報視圖(如此)。它實際上不是一個警報視圖,而是更多的向用戶顯示一些信息的視圖。我有一個朦朧的背景視圖和頂部的視圖。如果我嘗試在Interface Builder創建此它變得太複雜,你不能選擇在後臺的意見並將其移動等未失子視圖到錯誤的看法等等...編程方式創建具有多個標籤

方案
我我試圖做的是創建一個視圖,其中包含一些標籤和一個按鈕。視圖控制器具有基於此的難度屬性,它將在標籤/標籤數量中具有不同的文本。
I.e.易 - 3個標籤
硬盤 - 4個標籤

我創建dimmedView和警報(風格)查看這樣的:

// Setup the dimmedView 
UIView *dimmedView = [[UIView alloc] initWithFrame:self.view.frame]; 
dimmedView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6]; 

// Setup the startingAlertView 
UIView *startingAlertView = [[UIView alloc] init]; 
startingAlertView.backgroundColor = [UIColor whiteColor]; 

我然後創建基於一些邏輯的三/四標籤和添加基於邏輯的necassary標籤也基於邏輯startingAlertView

這是顯而易見的問題是,在任何時候對所述視圖中的幀被設置。這意味着它返回0,0,0,0。我想要發生的是根據添加的標籤獲取所需高度的視圖。

我正在建設IOS7並使用自動佈局。我是否應該設置約束條件,然後調整視圖中的相關高度和位置?

+0

@MarcoPace或,使用自動佈局,旨在解決這個問題。 – jrturton

+0

@jrturton好,我沒有讀最後一句話。由於它不使用IB,我錯誤地認爲他不想使用它們。感謝您的回覆。 –

+0

謝謝,在這個例子中,IB沒有用......主要是因爲這是頂層視圖,下面有一個複雜的視圖。如果你可以切換視圖以在IB內顯示/隱藏,而你在其他人身上工作......現在這將是有用的 – StuartM

回答

2

我建立了IOS7並使用自動佈局。我是否應該設置約束條件,然後調整視圖中的相關高度和位置?

是。您不要在自動佈局下使用initWithFrame:,或者更確切地說,您可以,但框架被忽略。使用CGRectZero的框架創建您的調光視圖,將translatesAutoresizingMasksToConstraints設置爲NO,將其添加到您的主視圖並創建約束,將其鎖定到超視圖的所有邊緣。

然後,添加您的警報視圖,再次爲零的框架和translates...屬性設置爲NO。在調光視圖中創建約束以將此視圖居中。該視圖將從其子視圖中獲取其大小,因爲標籤具有固有大小。

將您的標籤添加爲此視圖的子視圖,零框架和translates...設置爲NO。根據其內容,您可能希望設置首選的最大布局寬度或寬度限制。

創建約束將標籤固定到超視圖的左右邊緣,並將標籤以垂直「堆疊」排列起來。在每種情況下,您都可以添加填充以使警報帶點邊框。

這看起來像一個大量的代碼,所以你可能想讀我寫的visual format for auto layoutcreating constraints in code的文章,與相關autolayout convenience category,使您的生活更輕鬆。

+1

首先感謝您的答案。其次博客文章真棒,真的幫我自己找到答案。你是對的,它需要一些代碼和玩耍,但這大大有助於我對編碼約束的理解,所以謝謝! – StuartM

+0

不客氣! – jrturton

+0

嗨,我實際上總是使用CGRectZero,直到我使用這個開源項目https://github.com/BaiduLBS/BaiduMapKit,這是中國最受歡迎的地圖工具包。當在代碼中實例化其地圖視圖(UIView的子類)並將CGRectZero傳遞給init(框架:)時,它總是首次顯示錯誤!在第一次它可以正確顯示後,任何大於零的尺寸都不會有這個問題。我從來不知道爲什麼。你有什麼主意嗎 ? – Qiulang

0

如果你要自動佈局路線,那麼你可以添加約束,將讓每個標籤之間的適當空間,並與第一和最後一個標籤視圖的頂部和底部之間的適當空間。但是,如果您在Interface Builder中沒有這樣做,那麼您也可以跳過使用自動佈局,因爲在添加標籤時調整視圖的高度非常簡單。

您將由視線的高度設置爲你希望有周圍的標籤的頂部和底部空間的大小開始。然後每次添加標籤時,添加標籤的高度加上標籤之間的空間高度。

你也可以等到你添加完所有你想要的標籤,然後將高度設置爲底部標籤的y位置加上其高度,再加上你希望有各地的標籤底部空間。

0

是的,使用自動佈局,您可以從父視圖中獲取邊界。

下面是一個快速示例,請注意,我們不使用框架,並且將CGRectZero用於我們的UILabels,但定位來自updateConstraints。我正在使用Visual Format Language來佈置我推薦的標籤,如果您正在以編程方式進行編輯。

這裏我們將標籤作爲父視圖的寬度,然後疊放在一起。

#import "View.h" 

@implementation View{ 
    UILabel *_label1; 
    UILabel *_label2; 
    UILabel *_label3; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     _label1 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label1.translatesAutoresizingMaskIntoConstraints = NO; 
     _label1.text = @"LABEL 1"; 

     _label2 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label2.translatesAutoresizingMaskIntoConstraints = NO; 
     _label2.text = @"LABEL 2"; 

     _label3 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label3.translatesAutoresizingMaskIntoConstraints = NO; 
     _label3.text = @"LABEL 3"; 

     [self addSubview:_label1]; 
     [self addSubview:_label2]; 
     [self addSubview:_label3]; 
    } 


    [self updateConstraintsIfNeeded]; 

    return self; 
} 

-(void)updateConstraints 
{ 
    [super updateConstraints]; 

    NSDictionary *_viewsDictionary = NSDictionaryOfVariableBindings(_label1,_label2,_label3); 


    // Set the contraintsto span the entire width of the super view 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 

    [self addConstraints:constraints]; 

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label2]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 
    [self addConstraints:constraints]; 

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label3]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 

    [self addConstraints:constraints]; 


    // Last setup the vertical contraints other wise they will end up in a random place 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label1]-[_label2]-[_label3]" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 
    [self addConstraints:constraints]; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end