doesn iOS ScrollView требует ограничения для позиции или высоты y




uiscrollview doesn't scroll (5)

-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Bottom,Leading,Trailing spaces to superview set to 0, Width equals with View (ViewController's child))
-----Label1
-----etc...

Если я устанавливаю ограничение по высоте для моего представления контента (например, 1000), ScrollView отлично работает, но я получил статический ContentView 1000, что не является моей целью, потому что мой контент-контент получил динамический контент, поэтому он должен быть высотой контента необходимо.

Если я удалю ограничение высоты для моего ContentView, Xcode говорит:

Missing Constraints:
ScrollView need constraints for: Y position or height

ScrollView на самом деле закреплен сверху и снизу, поэтому я не знаю, почему Xcode хочет ограничить высоту для ScrollView ...

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


Установите ограничение на ярлык слева вверху справа и нижнего поля с представлением содержимого прокрутки и установите количество строк в UILable равным 0. Оно расширит ваше содержимое в соответствии с размером вашего контента


Это будет работать

-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Leading,Trailing spaces to ScorllView set to 0 | Height to dynamic (1000))
-----Label1
-----etc...

Сделайте то же самое для своего ContentView, свой собственный расчет для своего контента

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:YES];
[self adjustHeightOfTableview];
}

- (void)adjustHeightOfTableview
{
CGFloat height = tblMainMenu.contentSize.height;
CGFloat maxHeight = tblMainMenu.superview.frame.size.height - tblMainMenu.frame.origin.y;

// if the height of the content is greater than the maxHeight of
// total space on the screen, limit the height to the size of the
// superview.

if (height > maxHeight)
    height = maxHeight;

// now set the height constraint accordingly
self.tableViewHeightConstraint.constant = height;
[UIView animateWithDuration:0.1 animations:^{
    [self.view setNeedsUpdateConstraints];
}];
}

Редактировать 1

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    NSString *OptName_length = @" Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam";
    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0]};
    CGRect rect = [OptName_length boundingRectWithSize:CGSizeMake(tableView.bounds.size.width-150.0, MAXFLOAT)
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:attributes
                                                  context:nil];

    CGSize requiredSize = rect.size;
    return requiredSize.height +5.0f;
    }

Изменить 2

Проверьте сайт, это поможет вам ... uitableviewcell-dynamic-height-with-autolayout-conclusion


Ответ Бхарата Моди в значительной степени решает проблему, но мне (Xcode 8.3.2, iOS 10 SDK) также пришлось сопоставлять высоту и ширину Content View с высотой и шириной UIScrollView.

Это приведет к тому, что размер содержимого будет только видимой областью, но он сделает IB счастливым. Затем (я думаю), это просто вопрос правильного расчета размера контента и его программного программирования. Который я должен был бы сделать в любом случае, поскольку, если у вас есть динамический контент, вы можете сделать это только во время выполнения.

Вам также может потребоваться настроить настройки «Настроить параметры прокрутки» в контроллере просмотра, если у вас есть панель навигации.

Это то, что у меня есть:

Обратите внимание, что это может быть просто особенностью моей настройки, потому что официальные предложения ( https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html ) также не упоминают, что это необходимо сделать.

Я попытался понять это, используя только прокрутку, просмотр содержимого и еще один фиктивный вид фиксированной ширины и высоты для имитации контента, но ничто, казалось, не сделало IB счастливым.

(Извините, мне не хватает репутации, чтобы поместить это как комментарий к исходному ответу).

ОБНОВИТЬ:

Таким образом, на самом деле то, что я закончил, - это установить мой Content View на фиксированную высоту в IB и создать выход для этого ограничения высоты в коде. Затем после того, как представление загрузило весь свой динамический контент, я просто обновляю ограничение по высоте следующим образом:

self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15

И все работает. Ключ здесь в основном состоит в том, что когда в представлении прокрутки есть представление - это представление определяет размер содержимого прокрутки. Как уже упоминалось ранее, размер содержимого должен быть полностью определен во время сборки, чтобы IB был счастлив. Вы можете манипулировать значениями во время выполнения, но через розетки - это легко и безопасно.

Одно из преимуществ наличия представления содержимого с фиксированным размером в IB заключается в том, что, поскольку вы зафиксировали размер содержимого, представления внутри представления содержимого теперь можно определить как обычно, используя относительные смещения.


  1. Выберите контроллер вида
  2. Снимите флажок «Настроить прокрутки»


Убедитесь, что самый нижний элемент внутри вашего содержимого внутри вашего представления прокрутки имеет ограничение на нижнее пространство, равное 0, и убедитесь, что все элементы внутри представления содержимого имеют установленную высоту.

Это приводит к изменению размера контента в соответствии с элементами внутри него, и у вас нет фиксированной высоты вашего представления прокрутки / содержимого, и ваше представление прокрутки будет изменять размер экрана с помощью экрана телефона.





scrollview