UIScrollView не прокручивается независимо от большого размера содержимого

Я создал UIScrollView и добавил подпредставления к нему в Интерфейсном Разработчике, но я не в состоянии заставить его прокручиваться. Я смотрел на другие подобные вопросы, но я установил свой contentSize соответствующим образом. На самом деле, я даже пытался установить невероятно большой размер контента, и он ничего не меняет. Что мне не хватает? Обратите внимание, что UIScrollView - это IBOutlet:

@property (strong, nonatomic) IBOutlet UIScrollView *scroll;

Это на мой взгляд DidLoad:

self.scroll.scrollEnabled = YES;
[self.scroll setContentSize: CGSizeMake(2400,8000)];

Вот скриншоты из Интерфейсного Разработчика:

просмотр иерархии

scrollview и его подпредставления в конструкторе интерфейсов

ссылка на выход

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

экран во время работы

4 ответа

Решение

Выключение Auto Layout работает, но это не решение. Если вам действительно нужна автоматическая разметка, используйте ее, если она вам не нужна, выключите ее. Но это не правильное решение для этого решения.

UIScrollView работает по-другому с другими представлениями в Auto Layout. Вот примечание к выпуску Apple по Auto Layout, я скопировал интересный фрагмент (выделение мое, в третьем пункте):

Вот некоторые примечания относительно поддержки Auto Layout для UIScrollView:

  • В общем, Auto Layout считает верхний, левый, нижний и правый края вида видимыми. То есть, если вы прикрепите представление к левому краю его суперпредставления, вы действительно прикрепите его к минимальному значению x границ суперпредставления. Изменение границ происхождения суперпредставления не меняет положение представления.
  • Класс UIScrollView прокручивает свое содержимое, изменяя источник своих границ. Чтобы это работало с автоматическим макетом, верхний, левый, нижний и правый края в представлении прокрутки теперь означают края его представления содержимого.
  • Ограничения для подпредставлений представления прокрутки должны приводить к заполнению размера, который затем интерпретируется как размер содержимого представления прокрутки. (Это не следует путать с методом intrinsicContentSize, используемым для автоматического макета.) Чтобы задать размер окна прокрутки с помощью автоматического макета, ограничения должны быть либо явными в отношении ширины и высоты представления прокрутки, либо края вида прокрутки должны быть привязаны к представлениям за пределами своего поддерева.
  • Обратите внимание, что вы можете сделать так, чтобы подпредставление представления прокрутки отображалось (не прокручивалось) над другим содержимым прокрутки, создавая ограничения между представлением и представлением вне поддерева представления прокрутки, например суперпредставлением представления прокрутки.

Затем Apple продолжает показывать пример того, как правильно использовать UIScrollView с автоматическим расположением.

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

Еще раз, если вы не хотите использовать Auto Layout, выключите его. Затем вы можете установить contentSize обычный способ. Но вы должны понимать, что это автоматическое поведение Auto Layout.

Попробуйте отключить автолайот

Выбрать ViewController затем file inspectoг и в interface builder document раздел вы можете увидеть Use Autolayout проверено или нет. Если его проверил, то uncheck Это.

Эта информация UIScrollView и Autolayout может дать подробную информацию.

Попробуйте этот код, чтобы автоматически установить размер содержимого

сначала скопируйте и вставьте свой контроллер представления в методе viewDidLoad

 [self MHAutoContentSizeForScrollViewWithPadding:10 scrl:YOUR_SCROLLVIEW];

затем скопируйте и вставьте ниже метод viewDidLoad

-(void)MHAutoContentSizeForScrollViewWithPadding:(CGFloat)padding scrl:(UIScrollView*)view{
    if ([view isKindOfClass:[UIScrollView class]]) {
        CGRect rect = CGRectZero;
        for(UIView * view in YOUR_SCROLLVIEW.subviews){
            rect = CGRectUnion(rect, view.frame);
        }
        [YOUR_SCROLLVIEW setContentSize:CGSizeMake(rect.size.width, rect.size.height+padding)];
    } else {
        NSLog(@"You can only set the ContentSize for ScrollViews");
    }
}

подключите делегата YOUR_SCROLLVIEW и TextFeild Delegate также Happy Coding!!!

Если вы используете автоматическое размещение, поместите все в UIScrollView в другой UIView и поместите этот UIView в качестве единственного дочернего элемента UIScrollView. Тогда вы можете использовать AutoLayout.

Если вещи ближе к концу испорчены (конец, в каком бы направлении ни прокручивался ваш UIScrollView), измените ограничение в конце, чтобы иметь наименьший возможный приоритет.

У меня была эта проблема, и ни один из ответов в этой теме не помог.

Я установил верхнее ограничение для одного из моих вложенных представлений в моем UIScrollView равно UIViewControllerс view.topAnchor. МойUIScrollView поэтому не будет прокручиваться, так как это нарушит ограничение.

Как только я изменил ограничение и установил его равным моему UIScrollView.topAnchor это сработало, как ожидалось.

Другие вопросы по тегам