Ответы:
Всегда полезно показать полный рабочий фрагмент кода:
// 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->Clean
Simulator/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