2014-06-25 1 views
1

내가 프로그래밍있는 UIButton을 만드는 일이 같은 뷰에 추가하지 않습니다translatesAutoresizingMaskIntoConstraints는

self.button = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 100, 30)]; 
[self.button setTitle:@"Test" forState:UIControlStateNormal]; 
self.button.translatesAutoresizingMaskIntoConstraints = YES; 
[myView addSubview:self.button]; 

버튼이 제대로 나타나고 translatesAutoresizingMaskIntoConstraints이기 때문에이 올바른지 고유의 크기를 (사용하지 않습니다 에). 그러나, myView.constraints 인쇄 할 때 단추에 관한 제한이 표시되지 않습니다. 정의에 따라 TranslateAutoresizingMaskIntoConstraints가 켜져 있으면 제약 조건이 자동으로 생성되어이 경우 myView 인 수퍼 뷰에 추가됩니다.

여기서 제약이 생성되지 않는 이유는 무엇입니까? 그리고 왜 레이아웃 시스템은 여전히 ​​화면에 버튼을 레이아웃하는 방법을 알고 있습니까?

******** 업데이트 : 나는 이유를 알고 있다고 생각합니다. UIView에 제약 조건이 연결되어 있지 않으면 레이아웃 시스템이 제대로 작동하지 않습니다. 뷰 프레임을 사용합니다. 이 경우 translatesAutoresizingMaskIntoConstraints를 켜면 버튼의 본질적인 제약 조건이 생성되지 않으므로 버튼에 제약 조건이 없습니다. 따라서 프레임이 사용됩니다. 코드에서 생성 된 모든 UIView는 translatesAutoresizingMaskIntoConstraints의 기본값이 YES이므로 뷰에 대한 제약 조건이 자동으로 생성되지 않습니다. 프레임이 사용됩니다. 그것은 이전 버전과의 호환성을 위해 완벽합니다.

translatesAutoresizingMaskIntoConstraints = YES 경우, 뷰의 슈퍼 뷰는 뷰의 자동 크기 마스크에 보이는 그것을 구현 제약을 생산, 자체합니다 (수퍼)에 그 제약 조건을 추가합니다 다음과 같이

+0

autolayout을 사용하고있는 다른보기가 있습니까? – Wain

+0

기본보기는 AutoLayout을 사용하는 nib에서로드됩니다. – namanhams

답변

2

워드 프로세서의 동작을 설명합니다.

번역 설명을 기반으로 변환 된 제약 조건을 찾기 위해 - [UIView constraints] 배열을 볼 수 있어야하지만 생성 된 제약 조건은 여기에 추가되지 않습니다. 프로그래밍 방식으로보기를 만들면 (보기가 추가 된 경우 냄새가 나는 경우에만 예상되는 행동을 취할 것입니다).

디버거를 신중하게 검토 한 결과, 개인화 된 방법 ‑[UIView(UIConstraintBasedLayout) _constraintsEquivalentToAutoresizingMask]을 통해 레이아웃 중에 요구 사항에 따라 제약 조건이 생성된다는 결론을 얻었습니다.

는 제약이 "UIView+TestConstriants.h"

전화 코드의이 라인이 ofter self.button를 추가 # import를 당신의 의 ViewController 클래스에 UIView의

@interface UIView(TestConstriants) 

- (NSArray *)_constraintsEquivalentToAutoresizingMask; 

@end 

가져 오기이 카테고리의 범주를 만드는 것이 보는 방법 ~ 보기 :

NSLog(@"constraints: %@", [self.button _constraintsEquivalentToAutoresizingMask]); 

위 코드는 autoResize mask와 동일한 제약 조건을 기록합니다. 자동 크기 조정 마스크을 다른 값으로 설정하여 테스트 해보십시오. 이에 해당하는 제약 조건이 적용됩니다.

+0

실제로 버튼에 제약 조건이 생성되지 않습니다. 설명을 보려면 첫 번째 게시물 업데이트를 참조하십시오. – namanhams

+0

그러나보기가 자동 레이아웃이 활성화되어 있으면 항상 하위보기에 대한 제약 조건을 생성합니다. –

+0

그렇지 않습니다. 뷰에 이미 제약 조건이있는 경우 (추가하거나 뷰에 고유 크기가 있고 translatesAutoresizingMaskIntoConstraints = NO 인 경우)에만 제약 조건이 생성되지 않고 슈퍼 뷰는 무시됩니다. 이전 버전과의 호환성을위한 것입니다. 프로젝트에 사용자 정의 UIView가있는 non-autolayout 라이브러리를 사용한다고 가정합니다. 명시 적으로 원하지 않는 한 해당 뷰에 대해 제한 조건이 생성되지 않습니다. – namanhams