2013-10-08 49 views
0

我的應用從Autoresize遷移到Autolayout機制失敗。我需要的只是一個動態尺寸和子視圖的視圖,它們將與左上角相連,並與其超級視圖的大小相同。在IB中,我將PieView(我的超級視圖)的大小設置爲186x186。而讓IB生成所有需要的約束(我會在代碼中創建新的): Interface builder. Constraints described only for scroll view在Autolayout可視化表單中調整子視圖

PieView.m -updateConstraints()

- (void)updateConstraints { 
[super updateConstraints]; 
[self removeConstraintsAffectingViewAndSubviews]; 
[self setTranslatesAutoresizingMaskIntoConstraints:NO]; 

CGFloat sizeCoef = 0.7f; 
CGFloat percent = [self.category getFillinPercent]/100.0f; 
percent = percent > 1.0f ? 1.0f : percent; 
sizeCoef += (1.0f - sizeCoef) * percent; 

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:self 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0f 
                  constant:100.f];//kDiameter * sizeCoef]; 

NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:self 
                  attribute:NSLayoutAttributeHeight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0f 
                  constant:100.0f];//kDiameter * sizeCoef]; 
//_imgEmptyCircle, _imgFullCircle - UIImageViews 
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self); 
NSDictionary *metrics = @{@"height":@100.0}; 

[self addConstraints:@[width, height]]; 

NSString *visualForm = @"H:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|"; 
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm 
                    options:0 
                    metrics:metrics 
                     views:views]; 
visualForm = @"V:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|"; 
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm 
                     options:0 
                     metrics:metrics 
                     views:views]; 
[self addConstraints:verticalConstraints]; 
[self addConstraints:horizontalConstraints]; 

}

結果真的出乎我的意料。藍色的顯示正確,但我想要,但綠色的有奇怪的行爲。

Blue is the _imgEmptyCircle, green is the _imgFullCircle

關我當然有錯誤:無法同時滿足的約束。
首先ImageView的
NSIBPrototypingLayoutConstraint:[UIImageView的:0x8a37150(186)]>
NSLayoutConstraint:0xa0305c0五:[UIImageView的:V 0xa2795d0 '在生成時生成用於考慮到與固定框架IB自動' 0x8a37150(100) ]
二ImageView的
的同一個
可能爲PieView
( NSLayoutConstraint:0x8a40750五:[CEPieView:0x8a36e50(100)], NSLayoutConstraint:0xa030570五:| - (O) - [UIImageView:0x8a37150](名稱S: '|':CEPieView:0x8a36e50) NSLayoutConstraint:0xa0305c0五:[UIImageView的:0x8a37150(100)], NSLayoutConstraint:0xa0305f0五:[UIImageView的:0x8a37150] - (O) - [的UIImageView:0xa277cf0]> NSLayoutConstraint :0xa030620 V:[UIImageView:0xa277cf0(100)], NSLayoutConstraint:0xa030650 V:[UIImageView:0xa277cf0] - (0) - | (姓名:'|':CEPieView:0x8a36e50) )

請給我一個建議如何解決它。如何在AutoLayout機制的幫助下創建和舊的自動調整掩碼(UIViewAutoresizingFlexibleHeight,UIViewAutoresizingFlexibleWidth)。任何幫助將不勝感激。

+0

你能解釋一下哪一個是綠色的視圖,哪一個是藍色的看法?你的視圖層次結構如何設置? – axelcdv

+0

PieView有3個子視圖。其中之一,最後一個,現在不使用,在討論中是多餘的。第一個imageView具有藍色背景,第二個(在IB中間)具有綠色背景。謝謝,回覆 –

回答

0

您設置約束的方式是錯誤的。基本上你要求superview是100pts和100pts,並且包含兩個子視圖,每個100pts和100pts並且在AND之上。因此,首先你的超級觀點必須是200磅寬和/或高,然後你不能有兩個彼此相鄰的頂部視圖。 你真正想做的事情(我認爲)是遇到了什麼:

NSString *visualForm = @"H:|[_imgFullCircle]|"; // No need to explicitly set the height 

然後加入相應的約束,則:

visualForm = @"H:|[_imgEmptyCircle(height)]|"; 

並添加其他約束對於這一點,做同樣的垂直約束。

基本上你想最終:

//_imgEmptyCircle, _imgFullCircle - UIImageViews 
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self); 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgEmptyCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgFullCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]];                  
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgEmptyCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgFullCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]];  
+0

謝謝,我明白我的視覺格式有什麼問題。但我想動態調整超級視圖的大小。調用 '[self addConstraints:@ [width,height]];'在你的約束不起作用的時候從上面的代碼中調用。 因此,在我的情況下,我想調整superview從186x186在IB到100x100的代碼和autoresize子視圖(100x100)。謝謝! –

+0

它不起作用?它給你什麼結果?通常情況下,這應該起作用,因爲子視圖被限制爲與超視圖大小相同(您也可以直接確定在IB中) – axelcdv

+0

因此,超視圖與IB保持相同的大小。我的代碼: '.... [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@「V:| [_imgFullCircle] |」 選項:0 metrics:nil views:views]]; [自addConstraints:@ [寬度,高度]]' ** **截圖 http://s16.postimg.org/rk14u68ut/Screen_Shot_2013_10_08_at_3_55_49_PM.png –

相關問題