Динамическая высота UIView с автоматическим расположением в iOS 6
В течение последних нескольких дней я пытаюсь выполнить довольно простой (по крайней мере, должен) макет с использованием ограничений автоматической компоновки, но без успеха.
Моя иерархия просмотров:
UIScrollView
- UIView (вид контейнера)
----- UILabel (Multirow label)
----- UIWebView
----- UILabel
----- UIButton
![View hierarchy in IB]()
Желаемая функциональность - это вид контейнера, который должен расширяться в соответствии с размером содержимого. Чтобы увеличить высоту UIWebView, я использую следующий код:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[self.webView sizeToFit];
}
Я пробовал много разных ограничений, причем самыми разумными были:
1. Нажмите верхнее пространство из супервизора для 1-й метки (название события)
2. Выровняйте вертикальное расстояние для 1-й метки и UIWebView
3. Выровнять вертикальное расстояние для остальных элементов (то есть UIWebView - UILabel (Дата события) и UILabel (Дата события) - UIButton)
4. Вид контейнера имеет ограничение приоритета нижнего вертикального пространства с низким приоритетом (1) с его контролем
В результате я получаю следующее:
![enter image description here]()
UIWebView расширяется, но не нажимает метку даты события и кнопку, а также вид контейнера не расширяется.
Любая помощь будет принята с благодарностью.
Вы можете скачать образец проекта Xcode отсюда.
Ответы
Ответ 1
Вы устанавливаете ограничение высоты вашего веб-браузера как 266. Именно поэтому высота веб-представления все еще исправлена.
Вы можете создать это ограничение высоты как IBOutlet, например:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint;
И затем вы можете изменить константу ограничения высоты, когда веб-представление закончит загрузку содержимого. Сам веб-просмотр состоит из прокрутки внутри, поэтому, если вы хотите получить общую высоту содержимого:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height;
}
Или, видимо, это тоже работает:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[self.webView sizeToFit];
self.webViewHeightConstraint.constant = self.webView.frame.size.height;
}
Ответ 2
Вам может потребоваться задержка перед обновлением размера содержимого веб-обозревателя. И masonry полезен для использования автозапуска.
-(void)webViewDidFinishLoad:(UIWebView *)webview{
[self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.001];
}
-(void)checkContentOnDelay:(UIWebView *)webview{
CGSize contentSize = webview.scrollView.contentSize;
if (contentSize.height > 2) {
[webview updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(contentSize.height);
}];
}else{
[self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.01];
}
}