Ответы:
Всегда полезно показать полный рабочий фрагмент кода:
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
Swift 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
Я не нашел способа установить contentSize в IB (начиная с Xcode 5.0) .
Примечание. Если вы используете Autolayout, лучше всего разместить этот код внутри -(void)viewDidLayoutSubviewsметода.
myScrollView.delegate = selfТАКЖЕ, если это все еще не работает, ответ ниже содержит ОТЛИЧНЫЙ совет (перейдите на свой xib / StoryBoard и убедитесь, что «AutoLayout» отключен). Подсказка: вы также можете включить его <UIScrollViewDelegate>в свой .h файл, если хотите делать такие вещи, как программная прокрутка UIScrollView.
viewDidLayoutSubviewsзаставил меня работать.
Если вы не можете прокрутить вид даже после того, как вы установили contentSize правильно, убедитесь , что вы снимите «Использовать AutoLayout» в Interface Builder -> File Inspector.
Вам необходимо установить contentSizeсвойство представления прокрутки, чтобы оно правильно прокручивалось.
Если вы используете autolayout, вам необходимо установить contentSizeв viewDidLayoutSubviewsдля того , чтобы применять его после autolayout завершается.
Код может выглядеть так:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSizeна размер contentView, размер scrollView и contentView, кажется, устанавливается одинаковым. Но установив для высоты contentSizeзначение больше, чем высота contentView, это сработало.
viewDidLayoutSubviewsможет вызываться несколько раз в течение жизненного цикла, поэтому вы рискуете увеличить высоту больше, чем ожидалось.
Ответ правильный - для прокрутки необходимо установить размер содержимого.
Если вы используете построитель интерфейсов, то простой способ сделать это - использовать атрибуты времени выполнения, определенные пользователем. Например:

Попробуйте увеличить размер контента до огромных чисел. Я не мог понять, почему мое представление прокрутки не прокручивается, даже если размер его содержимого кажется больше, чем размер элемента управления. Я обнаружил, что если размер содержимого меньше необходимого, он также не работает.
self.scrollView.contentSize = CGSizeMake(2000, 2000);
Вместо 2000 вы можете поставить свои большие числа. И если это работает, это означает, что размер вашего контента недостаточно велик при изменении размера.
Для работы режима прокрутки делегат не требуется.
Убедитесь, что для свойства contentSize представления прокрутки установлен правильный размер (т. Е. Достаточно большой, чтобы вместить весь ваш контент).
Снимите флажок "Использовать автопрокладку" для меня.
Среда: xCode 5.0.2 Раскадровки ios7
В моем случае мне пришлось установить delaysContentTouchesзначение true, потому что все объекты внутри scrollView захватывали события касания и обрабатывали сами себя, а не позволяли самому scrollView обрабатывать их.
Установить contentSizeсвойство UIScrollviewв ViewDidLayoutSubviewsметоде. Что-то вроде этого
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
Идея о том, почему представление прокрутки не прокручивается, потому что вы устанавливаете размер содержимого для прокрутки меньше, чем размер представления прокрутки, что неверно. Вы должны установить размер содержимого больше, чем размер вашей прокрутки, чтобы перемещаться по нему во время прокрутки.
Та же самая идея с масштабированием, вы устанавливаете минимальное и максимальное значение для масштабирования, которое будет применяться через действие масштабирования.
добро пожаловать :)
Одно небольшое дополнение, все вышеперечисленное - это фактические причины, по которым ваше представление прокрутки может не прокручиваться, но иногда бездумно это может быть причиной, особенно когда scrollview добавляется через код, а не IB, вы могли добавить свои подпредставления в родительский вид, а не в scrollview это заставляет subview не прокручиваться
и держите размер содержимого установленным и больше, чем родительский фрейм представления (даааа !!)
Я заставил это работать с первой попытки. С автоматическим макетом и всем остальным, без дополнительного кода. Затем представление коллекции превратилось в банан, вылетело во время выполнения, я не смог найти, что было не так, поэтому я удалил и воссоздал его (я использую Xcode 10 Beta 4. Это было похоже на ошибку), а затем прокрутка исчезла. Однако представление «Коллекция» снова заработало!
Много часов спустя .. вот что исправило для меня. У меня была такая раскладка:
UIView
Все дело в ограничениях. Безопасная зона определяется системой автоматически. В худшем случае удалите все ограничения для прокрутки и просмотра содержимого и не позволяйте IB сбрасывать / создавать их за вас. Сделайте их вручную, все работает.
в основном концепция заключается в том, чтобы представление содержимого соответствовало Scrollview, что соответствует безопасной области.
Но как таковой это не сработало. Просмотр содержимого пропустил высоту. Я пробовал все, что мог, и единственное, что помогало, - это созданная с помощью элемента управления высота представления содержимого и перетаскивание представления содержимого… на себя . Это определило фиксированную высоту, значение которой было вычислено из размера контроллера представления (определенного как произвольная форма, длиннее, чем реальный дисплей, чтобы содержать все мои подпредставления), и, наконец, это снова сработало!
если вы получаете сообщение (IOS8 / swift), viewDidLayoutSubviewsкоторого не существует, используйте вместо этого следующее
override func viewDidAppear(animated: Bool)
Это исправило это для меня
То, о чем раньше не упоминалось!
Убедитесь, что ваша розетка правильно подключена к scrollView! На нем должен быть закрашенный круг, но даже если вы закрасили круг, scrollView может не быть подключен - так что дважды проверьте! Наведите указатель мыши на кружок и посмотрите, выделится ли фактическая прокрутка! (Это был случай для меня)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
В большинстве случаев код верен, если вы следовали руководству, но многие новички не знают, что scrollView НЕ будет нормально прокручивать симулятор. Предполагается, что прокрутка выполняется только тогда, когда вы нажимаете на коврик для мыши и одновременно прокручиваете. Многие опытные пользователи XCode / Swift / Obj-C так привыкли к этому, что не знают, как это могло быть упущено новичками. Чао :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
Этот код будет работать отлично, пока вы будете делать то, что я сказал выше.
Если ни одно из других решений не работает для вас, дважды проверьте, действительно ли ваше представление прокрутки UIScrollView в Interface Builder.
В какой-то момент за последние несколько дней мой UIScrollView тип спонтанно изменился на a UIView, хотя его класс сказал UIScrollViewв инспекторе. я используюXcode 5.1 (5B130a) .
Вы можете создать новое представление прокрутки и скопировать измерения, настройки и ограничения из старого представления, либо вы можете вручную изменить вид на a UIScrollViewвxib файле. Я провел сравнение и обнаружил следующие отличия:
Оригинал:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
После спонтанной смены типа:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
Поэтому я заменил <view>строку своей оригинальной<scrollView> строкой.
Я также заменил закрывающий тег представления </view>на</scrollView> .
Убедитесь, что id такой же, как у текущего представления, в этом случае: id = "qRn-TP-cXd".
Мне также пришлось очистить xib из кеша Xcode, удалив производные данные приложения:
Xcode->Window->Organizer->Projects, выберите свой проект, в строке "Производные данные" нажмите Удалить ...Или при использовании устройства:
Xcode->Window->Organizer->Device, выберите свое устройство-> Приложения, выберите приложение, нажмите (-)Теперь очистите проект и удалите приложение с симулятора / устройства:
Xcode->Product->CleanSimulator/device->pressи удерживайте app->click(X), чтобы удалить его.После этого вы сможете создавать и запускать свое приложение, а также снова пользоваться функцией прокрутки.
PS Мне не нужно было устанавливать размер содержимого прокрутки viewDidLayoutSubviewsили отключать автоматическую компоновку, но YMMV.
Если ваше scrollViewпредставление containerViewнекоторого типа, убедитесь, что оно scrollViewнаходится в пределах фрейма или границ containerView. У меня было то, containerView.clipsToBounds = NOчто все еще позволяло мне видеть scrollView, но поскольку оно scrollViewне было в границах, containerViewоно не обнаруживало сенсорных событий.
Например:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
Вы сможете увидеть scrollView, но он не получит взаимодействия с пользователем.
добавление следующего кода viewDidLayoutSubviewsсработало для меня с Autolayout. Перепробовав все ответы:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
Добавьте UIScrollViewDelegateи добавив следующий код в viewDidAppearметод, исправивший это для меня.
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
Моя проблема была решена:
Как только я удалил верхние и / или нижние ограничения, привязанные к безопасной области и / или супервизору, представления внутри scrollView могли снова прокручиваться и не оставались фиксированными в верхней или нижней части экрана!
Надеюсь, это избавит кого-то от многих часов боли с этой конкретной проблемой.
еще один забавный случай:
scrollview.superview.userInteractionEnabled должно быть истинным
Я потратил 2+ часа на погоню за этим, чтобы понять, что родительский элемент - это UIImageView, который, естественно, имеет userInteractionEnabled == false
После того, как я потерпел неудачу с предоставленными ответами в этой теме, я наткнулся на эту статью с решением.
Есть две вещи, которые не интуитивно понятны при настройке режима прокрутки с автоматическим размещением:
В этом суть статьи. Полное объяснение, включая иллюстрации, можно найти здесь.
Я обнаружил, что с этой проблемой AutoLayout ... если я просто ViewControllerиспользую UIViewвместо UIScrollViewкласса ... тогда просто добавляю UIScrollViewсебя ... что он работает.
У меня была такая же проблема в IB.
После установки ведущего, замыкающего, верхнего и нижнего края scrollView на его superView. Я внес следующие изменения, чтобы сделать containerView прокручиваемым, и это сработало.
Чтобы scrollView прокручивалась только в горизонтальном направлении, сделайте ограничение с помощью scrollView centerY = ContainerView centerY
и чтобы сделать его вертикально прокручиваемым, сделайте scrollView centerX = ContainerView centerX