2013-10-04 73 views
15

我使用自動佈局與UIScrollView來顯示對象的某些屬性。我從網絡服務中免費下載這些信息。 scrollview有一個不變的寬度(因爲我不想有垂直滾動行爲),它的子視圖用一組約束來尊重這個寬度,但是我不能動態增加UILabel的高度。使用Autolayout在UIScrollView中動態UILabel高度

我的代碼一切,我用viewDidLoad選擇創建子視圖...

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    . 
    . 
    . 

    UILabel *descriptionLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
    descriptionLabel.translatesAutoresizingMaskIntoConstraints = NO; 
    descriptionLabel.numberOfLines = 0; 
    descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 
    descriptionLabel.opaque = YES; 
    descriptionLabel.backgroundColor = [UIColor clearColor]; 
    descriptionLabel.textColor = [UIColor whiteColor]; 
    descriptionLabel.textAlignment = NSTextAlignmentRight; 
    descriptionLabel.font = [UIFont appetitoMediumItalicFontWithSize:15.0f]; 
    descriptionLabel.text = NSLocalizedStringFromTable(@"APT_DISH_DETAIL_DESCRIPTION", @"DishDetail", @"Etiqueta que contiene la descripción del platillo"); 
    [descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; 
    [self.detailContentScrollView addSubview:descriptionLabel]; 
    self.descriptionLabelS = descriptionLabel; 

    . 
    . 
    . 
} 

你可以看self.detailContentScrollView變量,這是從視圖控制器的筆尖創建的IBOulet

然後我用updateConstraints選擇...

- (void)updateConstraints { 
[super updateConstraints]; 
// This dictionary has more variables, ok 
NSDictionary *viewsDict = @{@"dish_description_label": self.descriptionLabelS}; 
. 
. 
. 

[self.descriptionLabelS setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; 
[self.detailContentScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view1][dish_description_label]-[view2][view3][view4]-|" options:0 metrics:nil views:viewsDict]]; 

. 
. 
. 
} 

最後,當我收到的Web服務的信息,我送sizeToFitUILabel從滾動視圖選擇和layoutIfNeeded。但我的UILabel從來沒有調整自己的新內容。我究竟做錯了什麼?

回答

7

UIScrollView的內容大小與自動佈局動態更新,也許你只是必須執行以下操作

- (void) setupScroll 
{ 
    [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [_contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [_scrollView addSubview:_contentView]; 

    NSArray *horizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"|[_contentView]|" 
                    options:0 
                    metrics:nil 
                    views:NSDictionaryOfVariableBindings(_contentView)]; 
    NSArray *vertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_contentView]|" 
                   options:0 
                   metrics:nil 
                    views:NSDictionaryOfVariableBindings(_contentView)]; 

    [_scrollView addConstraints:horizontal]; 
    [_scrollView addConstraints:vertical]; 

    UIView *mainView = self.view; 
    horizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"|[_contentView(==mainView)]|" 
                 options:0 
                 metrics:nil 
                  views:NSDictionaryOfVariableBindings(_contentView, mainView)]; 

    [mainView addConstraints:horizontal]; 
} 

哪裏_contentView是您的UILabel(如果你把一個視圖容器更復雜的視圖層次)和自我。視圖是控制器視圖(或其他任何東西)。希望這有助於也是:iOS Autolayout with UIScrollview: Why does content view of scroll view not fill the scroll view? ....

也不要忘記建立你的UILabel preferredMaxLayoutWidth

乾杯!

+0

這是對這個問題的另一個功能的解決方案,謝謝。 – specktro

+0

檢查這個職位的完整實施:http://arielelkin.github.io/articles/uilabel-plus-uiscrollview-plus-autolayout/ – Eric

+0

@Eric:鏈接關閉。 – testing

1

我有同樣的問題。似乎有一個蘋果的錯誤,所以多行文本需要一個兩遍的方法來佈局正確,它都依賴於屬性preferredMaxLayoutWidth。

我結束了添加這兩種方法的ScrollViewController:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 
    [self performSelectorOnMainThread:@selector(adjustScrollContentSizeOnMainThread) withObject:nil waitUntilDone:NO]; 
} 

- (void)adjustScrollContentSizeOnMainThread 
{ 
    self.myLabel.preferredMaxLayoutWidth = self.myLabel.bounds.size.width; 
} 

我根據我對這個答案的解決方案:https://stackoverflow.com/a/13616052/2828256

+0

感謝一噸...與它戰鬥了很長一段時間......並且你救了我。 – harshitgupta

+1

沒有這樣的錯誤,所以這種方法不是必需的。 @ D33pN16h7的答案完美無缺。將標籤添加爲scrollview的子視圖,將其numberOfLines設置爲0或大於1,並向scrollview添加特殊約束:@@ H:| [label(scrollview)]「'和」@「V: | [標籤] |「'。 – Eric

7

如果你想與意見,使之:

  • 添加約束高度> = [您想要的最小值]的UIScrollview,例如480

  • 將UILabel添加到高度約束> = [minimum value you wan]例如460

像下面的圖像:

scrollView constraints label constraints viewController the output will be something like that

,如果你需要使它編程

UIScrollView *scrollView= [UIScrollView new]; 
 
    scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
 
    [self.view addSubview:scrollView]; 
 

 
    UILabel *scrollViewLabel = [[UILabel alloc] init]; 
 
    scrollViewLabel.numberOfLines = 0; 
 
    scrollViewLabel.translatesAutoresizingMaskIntoConstraints = NO; 
 
    [scrollView addSubview:scrollViewLabel]; 
 

 
    scrollViewLabel.text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque ac urna ac ipsum sodales fermentum ornare quis tellus. Integer urna dolor, placerat ut pharetra sit amet, mattis a eros. Maecenas dapibus accumsan felis eget faucibus. Nulla rhoncus gravida neque, sed suscipit ex tempor quis. In sagittis sed enim ut posuere. Donec varius euismod rutrum. Pellentesque mauris sem, mollis id odio eu, maximus interdum elit. Mauris pharetra magna ut tortor lobortis sollicitudin. Cras volutpat porta facilisis. Praesent lacinia mi at volutpat accumsan. Sed eu cursus metus. Donec a convallis nunc. Curabitur tempus accumsan lacus vitae luctus. Sed non quam non leo condimentum congue. Nam dui ipsum, elementum in congue id, mollis ac mauris. Morbi finibus turpis quam, ut venenatis magna malesuada ac. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam erat volutpat. Curabitur nulla mi, aliquam faucibus blandit et, maximus eu libero. Duis semper, est posuere egestas interdum, quam nibh convallis odio, efficitur tempor purus arcu quis justo. Donec euismod feugiat urna in viverra. Sed vel tristique massa. Morbi in consequat sem. Nunc placerat lacus a mauris tempus porttitor. Fusce sed iaculis tortor, nec luctus ligula. Donec euismod metus mauris. Mauris sit amet euismod sapien. Praesent lobortis interdum ligula consequat viverra. Quisque et tortor mattis, congue dolor a, sagittis ligula. Phasellus in lacinia magna. Fusce vel placerat nisi. Maecenas egestas mattis lorem, vel tincidunt mauris eleifend et. In eu pulvinar nibh. Suspendisse ac suscipit orci. Suspendisse at lectus vel purus hendrerit lacinia at posuere sapien. Nunc auctor nisi eget nunc suscipit auctor. Donec fringilla odio lectus, quis porttitor nisl fermentum eget. Nam nunc purus, lobortis id sem porta, accumsan egestas quam. Integer blandit feugiat nunc ac scelerisque. Pellentesque vehicula, massa eget mollis aliquam, felis nulla posuere elit, at gravida elit diam id ligula. Suspendisse pharetra velit sed lacus scelerisque viverra. Maecenas volutpat non metus a interdum. In vitae vestibulum enim. Proin vitae libero non odio finibus pulvinar. In condimentum, sapien ac vehicula lobortis, dolor magna iaculis ex, in consectetur turpis orci eget justo. Suspendisse in lobortis justo, bibendum finibus lorem. Suspendisse ullamcorper diam eu elit sollicitudin, at tempus massa dignissim. In a ante rhoncus, porttitor tortor fermentum, molestie nunc. Phasellus mi dolor, vehicula sed sodales ut, sollicitudin ac ex. Praesent consequat, nunc sed posuere condimentum, risus ex malesuada nulla, sed faucibus velit elit ac risus. Ut venenatis ut nisl in hendrerit."; 
 

 

 
    /*** Auto Layout ***/ 
 

 
    NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, scrollViewLabel); 
 

 
    NSArray *scrollViewLabelConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollViewLabel(scrollView)]" options:0 metrics:nil views:views]; 
 
    [scrollView addConstraints:scrollViewLabelConstraints]; 
 

 
    scrollViewLabelConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollViewLabel]|" options:0 metrics:nil views:views]; 
 
    [scrollView addConstraints:scrollViewLabelConstraints]; 
 

 
    NSArray *scrollViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[scrollView]-|" options:0 metrics:nil views:views]; 
 
    [self.view addConstraints:scrollViewConstraints]; 
 

 
    scrollViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[scrollView]-|" options:0 metrics:nil views:views]; 
 
    [self.view addConstraints:scrollViewConstraints];

1

這裏是一個全面實施:

/*** Init the scrollview and the label ***/ 

UIScrollView *scrollView= [UIScrollView new]; 
scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview:scrollView]; 

UILabel *scrollViewLabel = [[UILabel alloc] init]; 
scrollViewLabel.numberOfLines = 0; 
scrollViewLabel.translatesAutoresizingMaskIntoConstraints = NO; 
[scrollView addSubview:scrollViewLabel]; 

scrollViewLabel.text = @"Bacon ipsum dolor sit amet drumstick meatloaf filet mignon ham t-bone andouille meatball venison cow capicola jerky shankle shoulder ground round. Shank filet mignon pork chop ham hock, short ribs jerky prosciutto tongue porchetta. Biltong kevin strip steak tail jowl jerky boudin drumstick pastrami bresaola. Sirloin tail shoulder salami, hamburger beef doner turducken chuck boudin kielbasa sausage pork loin. Ball tip leberkas fatback, pork chop tail ham ribeye. Bresaola pancetta jerky beef kielbasa frankfurter, corned beef filet mignon ribeye tongue porchetta. Prosciutto short loin sirloin doner brisket jerky swine sausage bresaola chuck. Meatloaf pork chop ribeye bacon jerky turducken, andouille pork belly beef ribs ham hock leberkas. Andouille tri-tip capicola beef t-bone shank tenderloin turducken ball tip salami pork belly shankle. Kielbasa pastrami brisket, kevin spare ribs swine tail beef jerky venison filet mignon. Kevin leberkas ball tip, brisket bresaola chuck meatloaf beef doner drumstick hamburger capicola chicken. Tri-tip biltong drumstick pork prosciutto strip steak pastrami brisket shank hamburger flank tail cow. Pastrami beef ribs ribeye boudin spare ribs pork loin. Meatloaf tail pork belly strip steak doner. T-bone meatball pastrami, pork strip steak salami tail beef boudin leberkas. Venison t-bone fatback, pig brisket pork loin landjaeger turkey tri-tip biltong. Drumstick tri-tip hamburger boudin meatball pork pork chop short ribs chuck doner t-bone bacon frankfurter porchetta beef. Turkey cow meatball andouille pancetta, flank strip steak ham hock. Frankfurter corned beef rump turducken brisket, jerky short loin flank tri-tip ball tip ham hock swine spare ribs."; 


/*** Auto Layout ***/ 

NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, scrollViewLabel); 

NSArray *scrollViewLabelConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollViewLabel(scrollView)]" options:0 metrics:nil views:views]; 
[scrollView addConstraints:scrollViewLabelConstraints]; 

scrollViewLabelConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollViewLabel]|" options:0 metrics:nil views:views]; 
[scrollView addConstraints:scrollViewLabelConstraints]; 

NSArray *scrollViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[scrollView]-|" options:0 metrics:nil views:views]; 
[self.view addConstraints:scrollViewConstraints]; 

scrollViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[scrollView]-|" options:0 metrics:nil views:views]; 
[self.view addConstraints:scrollViewConstraints]; 

有關詳細說明:

https://arielelkin.github.io/articles/uilabel-plus-uiscrollview-plus-autolayout

相關問題