2013-07-07 1 views
29

В течение последних двух дней я пытаюсь выполнить довольно простой (по крайней мере, должен) макет с использованием ограничений автоматической компоновки, но безуспешно.Динамическая высота UIView с автоматической компоновкой в ​​iOS 6

Моя точка зрения иерархии:
UIScrollView
- UIView (вид Container)
----- UILabel (многорядных ярлык)
----- UIWebView
----- UILabel
----- UIButton

View hierarchy in IB

Нужный является Функция добавления Контейнер v iew расширяется в соответствии с размером содержимого. Для того, чтобы увеличить высоту UIWebView я использую следующий код:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.webView sizeToFit]; 
} 

Я пробовал много различных ограничений, причем наиболее разумные из них является:
1. Pin пространства сверху от надтаблицы для 1-го наклейки (события Название)
2. Pin вертикальный интервал для 1-й этикетки и UIWebView
3. Палец вертикальное расстояние между ними для элементов отдыха (т.е. UIWebView - UILabel (Дата события) и UILabel (Дата события) - UIButton)
4. вид контейнера имеет низкий приоритет (1) нижнее вертикальное ограничение пространства с его контролем

В результате я получаю следующее: enter image description here

UIWebView расширяется, но не оттолкнуть метку даты события и кнопки, плюс вид Контейнер не расширяется либо.

Любая помощь была бы принята с благодарностью.

Вы можете скачать образец Xcode проект from here.

ответ

71

Вы устанавливаете высоту contraint вашего WebView, как 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; 
} 
+1

Большое спасибо за ваш ответ. Оно работало завораживающе! – Gerhat

+1

Жаль, что я не смог бы это сделать миллион раз ... Ваш ответ закончился 4 часа, когда я ударил головой по моей клавиатуре. – shulmey

+0

У меня гораздо более простая проблема, и я просто не могу заставить ее работать. Это просто «Label» в «Content View» в «Просмотр прокрутки» в «главном» представлении, и я делаю так, как вы говорите, я устанавливаю ограничение на «label.frame.size.height», но это не за работой. Насколько я понимаю, 'contentSize' должен« расти »автоматически. Кодекс здесь: http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

1

Вам может понадобиться задержку перед обновление содержимого веб-контента. И 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]; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^