Подтвердить что ты не робот

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 child))
-----Label1
-----etc...

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

enter image description here

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

enter image description here

Ответ 2

  • Выберите контроллер просмотра
  • Снимите флажок "Настроить прокрутки"

введите описание изображения здесь

Ответ 3

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

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

Ответ 4

Он будет работать

-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

Ответ 5

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

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

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

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

UIScrollView в IB без предупреждений

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

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

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


UPDATE:

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

self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15

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

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

Ответ 6

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

введите описание изображения здесь

Ответ 7

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

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

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