У меня есть UIScrollView
, который содержит много UIImageView
s, UILabels и т.д.... ярлыки намного длиннее, чем UIScrollView
, но когда я запускаю приложение, я не могу щелкнуть и прокрутить вниз...
Почему это может быть?
Спасибо
У меня есть UIScrollView
, который содержит много UIImageView
s, UILabels и т.д.... ярлыки намного длиннее, чем UIScrollView
, но когда я запускаю приложение, я не могу щелкнуть и прокрутить вниз...
Почему это может быть?
Спасибо
Всегда полезно показать полный фрагмент рабочего кода:
// 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
.
Если вы не можете прокручивать представление даже после правильной установки contentSize убедитесь, что вы снимите флажок "Использовать AutoLayout" в Interface Builder → File Inspector.
Вам нужно установить свойство contentSize
прокрутки, чтобы оно прокручивалось правильно.
Если вы используете автозапуск, вам нужно установить contentSize
в viewDidLayoutSubviews
, чтобы он мог быть применен после завершения автоопределения.
Код может выглядеть так:
-(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
);
}
Правильный ответ - чтобы сделать прокрутку, необходимо установить размер содержимого.
Если вы используете построитель интерфейса, то аккуратный способ сделать это - с пользовательскими атрибутами времени выполнения. Например:
Попробуйте изменить размер содержимого на огромные числа. Я не мог понять, почему мой профиль прокрутки не прокручивается, даже если размер его содержимого больше размера управления. Я обнаружил, что если размер содержимого меньше необходимого, он также не работает.
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 не выполняет прокрутку
и не устанавливайте размер содержимого и больше, чем исходный ракурс просмотра (duhh!!)
если вы получаете сообщение (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 NOT собирается нормально прокручиваться через симулятор. Предполагается прокручивать только при нажатии на коврик мыши и одновременной прокрутке. Многие пользователи Experienced XCode/Swift/Obj-C так полезны для этого, и поэтому они не знают, как это может быть упущено новичками. Ciao: -)
@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
спонтанно изменил тип на UIView
, хотя его класс сказал UIScrollView
в инспекторе. Я использую Xcode 5.1 (5B130a)
.
Вы можете создать новое представление прокрутки и скопировать измерения, настройки и ограничения из старого представления, или вы можете вручную изменить свое представление на 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 = "qRn-TP-cXd".
Мне также пришлось очистить xib от кеша Xcode, удалив данные, полученные из приложения:
Xcode->Window->Organizer->Projects
, выберите свой проект, в строке "Производные данные" нажмите "Удалить".Или, если вы используете устройство:
Xcode->Window->Organizer->Device
, выберите ваше устройство- > Приложения, выберите свое приложение, нажмите (-)Теперь очистите проект и удалите приложение из симулятора/устройства:
Xcode->Product->Clean
Simulator/device->press
и удерживайте app->click
(X), чтобы удалить егоЗатем вы сможете создавать и запускать приложение и снова выполнять прокрутку.
P.S. Мне не нужно было устанавливать размер содержимого прокрутки в 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 с автоопределением:
Это суть этой статьи. Для полного объяснения, включая иллюстрации, проверьте его.
Я обнаружил, что с этой проблемой AutoLayout... если я просто заставлю ViewController
использовать UIView
вместо UIScrollView
для класса... тогда просто добавлю сам UIScrollView
... что это работает.
Я сделал это с первой попытки. С автоматической разметкой и всем, без дополнительного кода. Затем представление коллекции стало банальным, сбой во время выполнения, я не смог найти, что было не так, поэтому я удалил и воссоздал его (я использую Xcode 10 Beta 4. Это было похоже на ошибку), а затем прокрутка исчезла. Представление Коллекции работало снова, все же!
Много часов спустя.. это то, что исправило это для меня. У меня был следующий макет:
UIView
Это все в ограничениях. Безопасная зона автоматически определяется системой. В худшем случае удалите все ограничения для видов прокрутки и содержимого и не создавайте для них сброс/создание IB. Сделай их вручную, все работает.
По сути, концепция состоит в том, чтобы иметь представление контента, соответствующее Scrollview, который подходит для Safe Area.
Но как таковой это не сработало. Содержание просмотра пропустило высоту. Я перепробовал все, что мог, и единственное, что делало трюк, это высота представления контента, созданная перетаскиванием элемента управления представлением контента... в себя. Это определило фиксированную высоту, значение которой было вычислено из размера контроллера представления (определяется как произвольная форма, длиннее, чем реальное отображение, чтобы содержать все мои подпредставления), и, наконец, это снова заработало!
У меня была такая же проблема в IB.
После установки начала, конца, верха и низа scrollView в его superView. Я сделал следующие изменения, чтобы сделать прокручиваемый контейнер, который работал.
Чтобы сделать scrollView только прокруткой в горизонтальном направлении, установите ограничение с scrollView centerY = ContainerView centerY
и чтобы сделать его вертикально прокручиваемым, сделайте scrollView centerX = ContainerView centerX
еще один забавный случай:
scrollview.superview.userInteractionEnabled должно быть истинным
Я потратил 2 часа в погоне за этим, просто чтобы выяснить, что родитель UIImageView, который, естественно, имеет userInteractionEnabled == false