it-roy-ru.com

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

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

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

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

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

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

39
Bioaim

Всякий раз, когда вы используете ScrollView с автоматическим макетом, всегда следуйте приведенным ниже инструкциям,

  1. Ограничения ScrollView: leadSpace, topSpace, TrailingSpace, bottomSpace для superView и убедитесь, что когда вы управляете перетаскиванием, чтобы добавить ограничение, добавьте его, нажав alt, чтобы ограничение было установлено без поля.

  2. Добавьте UIView в представление прокрутки в качестве представления содержимого и установите его ограничения: LeadSpace, topSpace, trailingSpace, bottomSpace в ScrollView без нажатия кнопки alt и установите equalWidth в ScrollView.

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

Если ограничения установлены правильно, то scrollView автоматически установит размер своего содержимого на основе компонента внутри него, и вам не нужно устанавливать размер содержимого вручную, также scrollView будет прокручиваться только в том случае, если компонент внутри представления контейнера не умещается внутри иначе это не будет прокрутка. Если вы все равно хотите сделать прокрутку, вам нужно проверить свойство Bounces Vertical из раскадровки, чтобы получить эффект отскока.

Примечание: _ ​​Пока вы устанавливаете ограничение для компонента внутри scrollView, вы увидите предупреждение об ограничении, пока не установите ограничение от верхнего компонента к нижнему, всегда помните, что ваш верхний компонент должен иметь ограничение сверху ( Ограничение по вертикали) для superView, а компонент внизу должен иметь ограничение пространства снизу для super view. Когда это удовлетворяется, все предупреждения со временем исчезнут.

Ограничения ScrollView: 

 enter image description here

Ограничения ContainerView: 

 enter image description here

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

 enter image description here

3
alicanozkara

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

-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-output

1
Jaleel Nazir

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

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

1
Babken Vardanyan

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

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

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

Вот что у меня есть:

 UIScrollView in IB without warnings

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

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

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


Обновление:

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

self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15

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

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

0
denis.kim

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

 enter image description here

0
MuhammadTalhaSiddiqui

Один маленький трюк - если у вас есть UIScrollView с UITextView внутри, который жалуется, что:

Msgstr "ScrollView нужно ограничение для положения или высоты". Или "UIScrollView прокручиваемая неоднозначность размера контента"

Просто снимите флажок «Прокрутка включена» по умолчанию на UITextView в IB. Работает как магия:)  enter image description here

0
Vitya Shurapov