2013-07-07 14 views
29

Son birkaç gün için, otomatik düzen kısıtlamaları kullanarak, ancak başarılı olmaksızın oldukça basit (en azından olması gereken) bir düzeni gerçekleştirmeye çalışıyorum.iOS 6'da otomatik düzen ile Dinamik UIView yüksekliği

Bence hiyerarşidir:
UIScrollView
- UIView (Konteyner görünümü)
----- UILabel (Multirow etiket)
----- UIWebView
----- UILabel
----- UIButton

View hierarchy in IB

istenen işlevselliği Konteyner v İçeriğin boyutuna göre genişlemek için iew. (
1. Pim üst uzay Superview gelen 1 etiket için Etkinlik: en makul olanları olmak üzere, birçok farklı kısıtlamaları çalıştı

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

: Aşağıdaki kodu kullanın UIWebView yüksekliğini arttırmak için Başlık) 1 etiket ve UIWebView için
2. Pim dikey boşluk
dinlenme elemanları 3. Pim dikey boşluk (yani UIWebView - UILabel (Etkinlik tarihi) ve UILabel (Etkinlik tarihi) - UIButton)
4. kapsayıcı görünümü,

süper görünümüyle düşük öncelikli (1) alt dikey alan kısıtlamasına sahiptir

alıyorum sonuç şudur: enter image description here

UIWebView genişler ama etkinlik tarihi etiket ve düğme aşağı itmek değil, artı Konteyner görünümü ya genişletmek etmez.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

Sen örnek Xcode proje from here.

cevap

71

Sen web görünümünün yüksekliği hala sabittir yüzden 266. olarak Web görünümü yüksekliği contraint ayarlıyorsunuz indirebilir.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint; 

Ve web görünümü içeriği indirmeyi tamamladığında sonra yükseklik kısıtlaması sabiti değiştirebilirsiniz:

Örneğin, bir IBOutlet olarak bu yükseklik sınırlaması oluşturabilir. web görünümü kendisi içeride kaydırma görünümünde oluşur, bu nedenle içerik genel yüksekliği elde etmek istiyorsanız:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height; 
} 

Ya görünüşe bu bir de çalışır:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.webView sizeToFit]; 
    self.webViewHeightConstraint.constant = self.webView.frame.size.height; 
} 
+1

Cevabınız için çok teşekkürler. Bir çekicilik gibi çalıştı! – Gerhat

+1

Keşke bunu milyonlarca kez söyleyebilirim ... Cevabınız klavyemde başımı dört saat sürdü. – shulmey

+0

Çok daha basit bir sorunum var ve bunu işe yaramıyor. "Ana" 'Görünüm'de bir' Scroll View ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dır ve ben' 'label.frame.size.height' için kısıtı belirlediğimi söylerim. Çalışma. "ContentSize" nin otomatik olarak "büyümesi" gerektiğini anladığımda. Http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

1

Daha önce bir gecikme gerekebilir webview içerik boyutunu güncelleme. Ve masonry otomatik yayın kullanımı için kullanışlıdır.

-(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]; 
    } 
}