나는 하루 종일 검색했지만 작동하지 못했습니다.가변 높이 및 레이아웃이있는 UILabel을 프로그래밍 방식으로 추가하는 방법
나는 왼쪽에 두 개의 레이블이 있고 오른쪽에 하나의 버튼이있는 UIView
입니다. autolayout
에 따라보기의 크기를 조정할 수 있도록 제약 조건을 추가했습니다. UIView
(두 개의 높이에 대한 제약 조건이 하나도 없음)의 높이에 대해 하나의 제약 조건을 설정했지만 모두 UILabel
의 내용이 다를 수 있기 때문에 모든 것이 완벽하게 작동했습니다.이 제약 조건을 제거하고 다음과 같은 두 가지 제약 조건을 설정했습니다. UILabel
(위쪽은 UILabel
, 나머지는 더 크다)은 UILabel
이고, 다른 하나는 아래쪽의 값인 UILabel
과 UIView
사이의 값을 고정합니다. 그것은 자동 레이아웃과 같은
은 10px 위의 높이를 증가하지 않기 때문에 UILabel
아래의 내용에도 불구하고, UILabel
아래의 intrinsicContentSize
을 계산 할 수 없습니다.
UIView *miView = [[UIView alloc] init];
UILabel *miLabel = [[UILabel alloc] init];
[miLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[miDetailsLabel setNumberOfLines:1];
[miDetailsLabel setText:@"Just one line."];
[miView addSubview:miLabel];
UILabel *miDetailsLabel = [[UILabel alloc] init];
[miDetailsLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[miDetailsLabel setNumberOfLines:0];
[miDetailsLabel setText:@"Enough text to show 3 lines on an IP4, except first of three UILabels on my test code, with no content"];
[miView addSubview:miDetailsLabel];
UIButton *miButton = [[UIButton alloc] init];
[miButton setTranslatesAutoresizingMaskIntoConstraints:NO];
[miView addSubview:miButton];
NSArray *constraint_inner_h = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[label]-(10)-[button(52)]-(0)-|" options:0 metrics:nil views:@{@"label":miLabel, @"button":miButton}];
NSArray *constraint_inner2_h = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[details]-(10)-[button]-(0)-|" options:0 metrics:nil views:@{@"details":miDetailsLabel, @"button":miButton}];
NSArray *constraint_label_v = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[label(18)]-(2)-[details(>=10)]-(0)-|" options:0 metrics:nil views:@{@"label":miLabel, @"details":miDetailsLabel}];
NSArray *constraint_button_v = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[button(22)]" options:0 metrics:nil views:@{@"button":miButton}];
[miView addConstraint:[NSLayoutConstraint constraintWithItem:miButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:miView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
[miView addConstraints:constraint_inner_h];
[miView addConstraints:constraint_inner2_h];
[miView addConstraints:constraint_label_v];
[miView addConstraints:constraint_button_v];
코드의 축소 버전을 넣었습니다.
내가 누락 된 아이디어가 있습니까?
감사
업데이트 : 내가 말했듯이 매트 조언 덕분에, 나는 코드를 설명하기 위해 preferredMawLayoutWidth:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSArray *allKeys = [dictOpcionesTickets allKeys];
for (NSString *key in allKeys) {
NSArray *tmpArray = [dictOpcionesTickets objectForKey:key];
if (![[tmpArray objectAtIndex:0] isEqual:@""]) {
UILabel *tmpLabel = [tmpArray objectAtIndex:3];
tmpLabel.preferredMaxLayoutWidth = tmpLabel.frame.size.width;
NSLog(@"width: %f",tmpLabel.frame.size.width);
}
}
[self.view layoutIfNeeded];
}
에 적절한 값을 설정하기 위해이 솔루션을 시도했습니다, 나는 그것을하고 있어요 동적으로, UILabel
(다른 흥미로운 정보 중에서)에 대한 참조가있는 배열로 사전을 만들었습니다. 나는이 코드를 실행하면, 나는 (내용이없는로 3 UILabel
, 첫 번째 레이블을 구문 분석 코드) 다음 로그를 얻을 :
2014-12-28 20:40:42.898 myapp[5419:60b] width: 0.000000
2014-12-28 20:40:42.912 myapp[5419:60b] width: 0.000000
2014-12-28 20:40:43.078 myapp[5419:60b] width: 229.000000
2014-12-28 20:40:43.080 myapp[5419:60b] width: 229.000000
2014-12-28 20:40:43.326 myapp[5419:60b] width: 229.000000
2014-12-28 20:40:43.327 myapp[5419:60b] width: 229.000000
하지만 여전히 같은 결과를 받고 있어요 ...의 UIView는 여전히 게재되고 높이는 제약 조건에 의해 설정된 최소 높이와 같으며 UILabel
의 내용을 표시하지 않습니다.
업데이트 2 여전히 바보짓을하고 있습니다.
나는 나의 초기 코드를 테스트하지만, iOS7에와 실제 아이폰 4에서 실행, 엑스 코드 (6)에서 새로운 프로젝트를 단순화, 그리고 UILabel
, 심지어는 부모 뷰에 layoutIfNeeded
를 호출하지 않고 preferredMaxLayoutWidth
또는 서브 클래스를 설정하지 않고 완벽하게 일했습니다.
- (void)addLabelsDinamically {
self.labelFixed.text = @"Below this IB label goes others added dinamically...";
UIButton *miBoton = [[UIButton alloc] init];
miBoton.translatesAutoresizingMaskIntoConstraints = NO;
[miBoton setTitle:@"Hola" forState:UIControlStateNormal];
[self.viewLabels addSubview:miBoton];
[self.viewLabels addConstraint:[NSLayoutConstraint constraintWithItem:miBoton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.viewLabels attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[boton(22)]" options:0 metrics:nil views:@{@"boton":miBoton}]];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[boton(40)]" options:0 metrics:nil views:@{@"boton":miBoton}]];
UILabel *miLabel = [[UILabel alloc] init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = [UIColor redColor];
miLabel.numberOfLines = 0;
miLabel.text = @"ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn";
[self.viewLabels addSubview:miLabel];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[label]-(10)-[boton]-(8)-|" options:0 metrics:nil views:@{@"label":miLabel,@"boton":miBoton}]];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previous]-(8)-[label]" options:0 metrics:nil views:@{@"label":miLabel,@"previous":self.labelFixed}]];
UIView *pre = miLabel;
miLabel = [[UILabel alloc] init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = [UIColor greenColor];
miLabel.numberOfLines = 0;
miLabel.text = @"ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn";
[self.viewLabels addSubview:miLabel];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[label]-(10)-[boton]-(8)-|" options:0 metrics:nil views:@{@"label":miLabel,@"boton":miBoton}]];
[self.viewLabels addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previous]-(8)-[label]" options:0 metrics:nil views:@{@"label":miLabel,@"previous":pre}]];
}
아 하나 UILabel
가 numberOfLines
세트, IB에 추가, 같은 화면에 내가있다 : 그것은 실제 프로젝트에 관해서 그러나이 작동하지 않습니다 (나는 원래 엑스 코드 4에서 사례 한 5 생각) '0', 수직 구속 조건 '보다 크거나 같음'및 수평 구속 조건을 비슷한 방식으로 설정합니다 (그러나 IB에 설정된 두 구속 조건 모두 ...). 그러면 완벽하게 작동합니다. 어떤 도움 ???
코드를 사용해 본적이 없지만 두 가지 라벨의'preferredMaxLayoutWidth'를 실제 폭으로 설정하여 도움이되는지 확인해보십시오. 그것이 세로로 커지는 방법을 레이블에 알려주는 설정입니다. – matt
그래, 내 연구에서 그 자산을 보았지만 내 레이블 너비 또한 superview의 너비에 달려 있기 때문에 그것을 사용하지 않았다. "preferredMaxLayoutWidth"에 무엇을 넣어야합니까? – raululm
글쎄, 우리가 들어가기 전에 실제로 작동하는 코드부터 시작해 보도록하겠습니다. 라벨에'numberOfLines' 값을 할당하지 않았기 때문에 여러분이 제공 한 코드는 완전히 무의미합니다. 그것 없이는 어떤 경우에도 포장하지 않을 것입니다. 따라서 실제로 랩/성장할 항목이있을 때까지 코드 코드를 수정 한 다음 더 많이 이야기 할 수있는 기회를 제공하겠습니다. 또한 레이블이 어떤 텍스트인지 알려 주어 실제로 일어나는 것이 있는지 확인할 수 있도록하십시오. – matt