2013-10-08 3 views
0

Autoresize 메커니즘에서 Autolayout 메커니즘으로 내 앱을 마이그레이션하지 못했습니다. 내가 필요로하는 것은 다이나믹 한 크기와 서브 뷰와 같은 크기를 가진 왼쪽 상단 구석에 연결된 서브 뷰이다. IB에서는 PieView (내 수퍼 뷰)의 크기를 186x186으로 설정했습니다. 그리고 (내가 코드에서 새로 만들 것이다)에 IB가 필요한 모든 제약 조건을 생성 할 수 있습니다 : Interface builder. Constraints described only for scroll viewAutolayout 시각적 양식의 하위 뷰 크기 조정

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

꺼짐 물론 나는 오류가 있습니다.
먼저 이미지 뷰 :
NSIBPrototypingLayoutConstraint [있는 UIImageView : 0x8a37150 (186)]>
NSLayoutConstraint : 0xa0305c0 V :있는 UIImageView : V 0xa2795d0 '고정 프레임 뷰의 제작시에 발생 IB 자동'0x8a37150 (100) ]
두번째 이미지 뷰 :
동일한 PieView 대한 예상되는
하나
( NSLayoutConstraint : 0x8a40750 V : CEPieView : 0x8a36e50 (100)] NSLayoutConstraint : 0xa030570 V : | - (0) - [UIImageView : 0x8a37150] (이름 S '|'CEPieView : 0x8a36e50) NSLayoutConstraint : 0xa0305c0 V :있는 UIImageView : 0x8a37150 (100)] NSLayoutConstraint : 0xa0305f0 V :있는 UIImageView : 0x8a37150 - (0) - [있는 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 옆에있는 두 개의 subview를 포함합니다. 먼저 superview는 200pts의 넓이 및/또는 큰 키가되어야합니다. 그러면 서로 옆에 있고 위에있는 두 가지보기를 가질 수 없습니다. 수직 제약에 대해 동일한을

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

그리고이 또 다른 제약 조건을 추가 할 :

NSString *visualForm = @"H:|[_imgFullCircle]|"; // No need to explicitly set the 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

고맙습니다. 제 시각적 형식에 무엇이 잘못되었는지 이해합니다. 하지만 superview의 크기를 동적으로 조정하고 싶습니다. 제약 조건이 작동하지 않으면 위의 코드에서 '[self addConstraints : @ [width, height]];를 호출하십시오. 내 경우에는 IB에서 186x186에서 코드에서 100x100으로 슈퍼 뷰 크기를 조정하고 서브 뷰 (100x100도 자동 크기 조정)를 조정하려고합니다. 고맙습니다! –

+0

어떻게 작동하지 않습니까? 그 결과는 어떤 결과를 줍니까? 일반적으로 서브 뷰는 슈퍼 뷰와 동일한 크기를 갖도록 제한되어 있기 때문에 정상적으로 작동합니다 (IB에서 직접 결정할 수도 있음) – axelcdv

+0

따라서 슈퍼 뷰는 IB와 동일한 크기를 유지합니다. 내 코드 : '.... [자체 addConstraints : [NSLayoutConstraint constraintsWithVisualFormat : @ "V : | [_imgFullCircle] |" 옵션 : 0 측정 항목 : 아니요 조회수 :보기]]; [자기 addConstraints : @ [너비, 높이]]' ** 스크린 샷 ** http://s16.postimg.org/rk14u68ut/Screen_Shot_2013_10_08_at_3_55_49_PM.png –

관련 문제