Динамическая высота 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];
    }
}