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

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

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

это в моем viewDidLoad:

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

вот скриншоты из интерфейса Строитель:

view heirarchy

scrollview and its subviews in interface builder

referencing outlet

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

screen while running

4 ответов


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

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

вот некоторые заметки относительно автоматической компоновки поддержка UIScrollView:

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

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

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

enter image description here

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


попробуйте отключить autolayot по

выберите ViewController затем file inspector и in вы можете ознакомиться 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 также Удачи В Кодировании!!!


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

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