Динамическая высота UILabel внутри UIScrollView с автозапуском

Я использую autolayout с UIScrollView чтобы показать некоторые атрибуты объекта. Я загружаю эту информацию динамически из веб-службы. Прокрутка имеет постоянную ширину (потому что я не хочу иметь вертикальное поведение прокрутки), и ее подзадачи уважают эту ширину с группой ограничений, но я не могу увеличить динамическую высоту UILabel .

Я все viewDidLoad и я использую селектор viewDidLoad для создания subviews …

 - (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 созданный из 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]]; . . . } 

и, наконец, когда я получаю информацию о веб-сервисе, я отправляю селектор и layoutIfNeeded из списка прокрутки. Но мой UILabel никогда не изменяет себя на новый контент. Что я делаю не так?

4 Solutions collect form web for “Динамическая высота UILabel внутри UIScrollView с автозапуском”

Размер содержимого 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 (если у вас более сложная иерархия представлений, помещенная в контейнер представления), а self.view – это вид контроллера (или что-то еще). Надеюсь, это также поможет: iOS Autolayout с UIScrollview: почему просмотр содержимого прокрутки не заполняет вид прокрутки? ….

Также не забудьте установить свой UILabel preferredMaxLayoutWidth

Ура!

Если вы хотите сделать это с представлениями:

  • Добавьте UIScrollview с высотой ограничения> = [минимальное значение, которое вы хотите], например 480

  • Добавьте UILabel в scrollview с ограничением высоты> = [минимальное значение, которое вы wan], например 460

Как на следующих изображениях:

scrollView ограниченияограничения меткиViewControllerвыход будет что-то вроде этого

если вам необходимо программно

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

Я была такая же проблема. Кажется, что есть ошибка с яблоком, поэтому многострочный текст требует двухпроходного подхода к правильности макета, и все это зависит от свойства 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

Вот полная реализация:

 /*** 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

  • Swift - UIScrollView не прокрутка
  • Получение всех представлений для UIScrollView
  • Просмотр прокрутки ios 8 Xcode not Scrolling - Swift
  • UIWebView внутри UIScrollView, потребляющий события касания
  • UIControll в UIScrollView не получает события касания
  • Bounds автоматически изменяет UIScrollView с вставками содержимого
  • Ограничение отскока для UIScrollview в iOS
  • Автоматическое прокручивание прокрутки
  • UICollectionView сбрасывает смещение содержимого после прокрутки вложенного UITableView
  • iOS - Использование раскадровки и автозапуска для центра UIScrollView
  • Вложенные UIScrollViews и маршрутизация событий
  • Interesting Posts

    Как разбить блок-цикл в Objective-C?

    Элементы UITabbar не отображаются до щелчка после обновления до Xcode 7

    Не удалось получить ячейку из своего DataSource

    Realm Swift 0.92.3 «Run Script Phase» не работает

    Быстрое переключение между видео с помощью AVFoundation

    Overriding -performSelector: в подклассе UIBarButtonItem

    Внедрить радиальный альфа-градиент на CALayer или CGImage?

    Уведомления GCM не принимаются, когда приложение находится в фоновом режиме в iOS

    Использование pkrevealcontroller на существующей раскадровке Xcode

    Как следует использовать {array | dictionary} WithCapacity?

    Утечка памяти ASIHTTPRequest

    Как я могу уволить / выпустить UIPageViewController после того, как последний контроллер просмотра будет прокручен?

    Агент агента компоновщика выходит из строя при доступе к @IBInspectable UIImage

    XCode UI Testing swizzle API класс методы

    Вызов сна (5); и обновление текстового поля не работает

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.