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

Я создал UIScrollView и добавил к нему подпредставления в Interface Builder, но я не могу заставить его прокручиваться. Я рассмотрел другие похожие вопросы, но правильно установил размер содержимого. Фактически, я даже попытался установить невероятно большой размер содержимого, и это не помогло. Что мне не хватает? Обратите внимание, что UIScrollView - это IBOutlet:

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

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

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

Вот скриншоты из Interface Builder:

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

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

ссылка на розетку

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

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


person golddove    schedule 22.01.2014    source источник
comment
Вы уже связали IBOutlet с раскадровкой?   -  person tia    schedule 22.01.2014
comment
Я так считаю. Я добавил скриншот справочной точки. Я также пробовал self.scroll.backgroundColor = [UIColor redColor];, и он отлично работает, поэтому я считаю, что все правильно связано.   -  person golddove    schedule 22.01.2014
comment
не могли бы вы установить рамку перед установкой setContentSize? просто для попытки.   -  person Shamsudheen TK    schedule 22.01.2014
comment
На что мне установить рамку?   -  person golddove    schedule 22.01.2014
comment
все, что меньше вашего ContentSize.   -  person Shamsudheen TK    schedule 22.01.2014
comment
Я пробовал self.scroll.frame = [UIScreen mainScreen].bounds; перед установкой contentSize, и это не имело значения.   -  person golddove    schedule 22.01.2014
comment
вы используете автопрокладку.?   -  person Akhilrajtr    schedule 22.01.2014
comment
Я не уверен, что это. Я не использовал его явно, но, возможно, косвенно. Я просто перетащил метки, кнопки, текстовые поля и средство выбора даты в представление прокрутки в Interface Builder и выровнял некоторые из них с помощью направляющих.   -  person golddove    schedule 22.01.2014
comment
Может ли это быть связано с тем, что он вложен в контроллер навигации? Я начал с шаблона Master-Detail, и он находится внутри DetailViewController.   -  person golddove    schedule 22.01.2014
comment
В построителе интерфейса выберите ViewController, затем file inspector и в разделе interface builder document вы увидите, что Use Autolayout установлен или нет. Если он отмечен, снимите галочку и попробуйте.   -  person Akhilrajtr    schedule 22.01.2014
comment
Действительно, это было проверено, и снятие флажка сработало! Не могли бы вы предоставить это в качестве ответа с объяснением того, что делает включение / выключение AutoLayout и почему это вызывает проблему? Большое тебе спасибо!   -  person golddove    schedule 22.01.2014
comment
Вы также должны убедиться, что добавляете scrollview в качестве subview к вашему основному представлению.   -  person ninehundreds    schedule 19.03.2015
comment
Возможный дубликат UIScrollView не прокручивается   -  person Henry Heleine    schedule 06.11.2018


Ответы (5)


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

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

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

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

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

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

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

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

person Enrico Susatyo    schedule 22.01.2014
comment
Я все еще не понимаю, почему раньше не выполнялась прокрутка, но я понимаю, как работает подход Pure Auto Layout, поэтому я думаю, что буду использовать его вместо простого отключения Auto Layout. Большое тебе спасибо! - person golddove; 22.01.2014
comment
Я предполагаю, что ранее не было никаких ограничений, чтобы сказать, что контент должен быть как минимум таким количеством !, и компилятор игнорирует ваш вызов setContentSize:, потому что он просто смотрит на ваши ограничения, чтобы увидеть, сколько контента есть в просмотре прокрутки . - person Enrico Susatyo; 22.01.2014
comment
У меня была очень похожая проблема. Я пытался создать режим прокрутки текстовых полей, которые увеличиваются и прокручиваются, чтобы оставаться на экране. Установка нижнего ограничения решила мою проблему! - person Elliot Blackburn; 20.01.2016

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

Выберите ViewController, затем file inspector и в разделе interface builder document вы увидите, что Use Autolayout установлен или нет. Если он проверен, то uncheck это.

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

person Akhilrajtr    schedule 22.01.2014
comment
Спасибо, это решило проблему прокрутки, но, как сказал @EnricoSusatyo, кажется, что ее можно решить, не отключая Auto Layout. - person golddove; 22.01.2014

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

сначала скопируйте и вставьте свой контроллер представления в метод 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 также удачного кодирования !!!

person kagmanoj    schedule 22.01.2014

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

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

person Rahul Patoliya    schedule 22.01.2014

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

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

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

person Steve Hancocks    schedule 25.06.2020