UIScrollView не прокрутка

У меня есть UIScrollView, который содержит много UIImageView s, UILabels и т.д.... ярлыки намного длиннее, чем UIScrollView, но когда я запускаю приложение, я не могу щелкнуть и прокрутить вниз...

Почему это может быть?

Спасибо

Ответ 1

Всегда полезно показать полный фрагмент рабочего кода:

// 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.

Ответ 2

Если вы не можете прокручивать представление даже после правильной установки contentSize убедитесь, что вы снимите флажок "Использовать AutoLayout" в Interface Builder → File Inspector.

Ответ 3

Вам нужно установить свойство 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
    );
}

Ответ 4

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

Если вы используете построитель интерфейса, то аккуратный способ сделать это - с пользовательскими атрибутами времени выполнения. Например:

enter image description here

Ответ 5

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

self.scrollView.contentSize = CGSizeMake(2000, 2000);

Вместо 2000 вы можете разместить свои собственные большие числа. И если это работает, это означает, что размер вашего контента невелик при изменении размера.

Делегат не нужен для просмотра прокрутки.

Ответ 6

Убедитесь, что свойство contentSize для прокрутки установлено на правильный размер (т.е. один достаточно большой, чтобы охватить весь ваш контент.)

Ответ 7

Снимите флажок "Использовать автоспуск", помогло.

Окружающая среда: xCode 5.0.2 Раскадровка ios7

Ответ 8

В моем случае мне пришлось установить delaysContentTouches в true, потому что объекты внутри scrollView все захватывали события касания и обрабатывали себя, а не позволяли самому scrollView обрабатывать его.

Ответ 9

Установите свойство contentSize для UIScrollview в ViewDidLayoutSubviews. Что-то вроде этого

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}

Ответ 10

Идея, почему просмотр прокрутки не прокручивается, потому что вы задаете размер содержимого для прокрутки меньше, чем размер прокрутки, что неверно. Вы должны установить размер содержимого больше, чем размер прокрутки, чтобы перемещаться по нему во время прокрутки.

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

добро пожаловать:)

Ответ 11

Одно небольшое дополнение, все приведенное выше, являются фактическими причинами, по которым прокрутка не может прокручиваться, но иногда бездумно это может быть причиной, особенно когда scrollview добавляется через код, а не IB, возможно, вы добавили свои подпрограммы в родительский вид а не в scrollview, это приводит к тому, что subview не выполняет прокрутку

и не устанавливайте размер содержимого и больше, чем исходный ракурс просмотра (duhh!!)

Ответ 12

если вы получаете сообщение (IOS8/swift), что viewDidLayoutSubviews не существует, используйте вместо этого следующее

override func viewDidAppear(animated: Bool)

Это исправило это для меня

Ответ 13

Что-то, о чем раньше не упоминалось!

Убедитесь, что розетка правильно подключена к экрану scrollView! Он должен иметь заполненный круг, но даже если вы заполнили круг, scrollView не может быть подключен - так что дважды проверьте! Наведите указатель мыши на круг и посмотрите, подсвечивается ли фактическое прокрутка! (Это был случай для меня)

//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

Ответ 14

В то же время код правильный, если вы следовали учебному курсу, но то, что многие новички не знают, - это то, что 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)
}

Этот код будет работать отлично, если вы делаете то, что я сказал выше

Ответ 15

Если ни одно из других решений не работает для вас, дважды проверьте, что ваш вид прокрутки на самом деле является 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
  • iOS Simulator/device->press и удерживайте app->click (X), чтобы удалить его

Затем вы сможете создавать и запускать приложение и снова выполнять прокрутку.

P.S. Мне не нужно было устанавливать размер содержимого прокрутки в viewDidLayoutSubviews или отключить автомат, но YMMV.

Ответ 16

Если ваш 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, но он не получит взаимодействия с пользователем.

Ответ 17

добавив следующий код в viewDidLayoutSubviews, который работал у меня с Autolayout. Попробовав все ответы:

- (void)viewDidLayoutSubviews
{
    self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);

}

//set the height of content size as required

Ответ 18

Добавьте UIScrollViewDelegate и добавьте следующий код в метод viewDidAppear это для меня.

@interface testScrollViewController () <UIScrollViewDelegate>

-(void)viewDidAppear:(BOOL)animated {
    self.scrollView.delegate = self;
    self.scrollView.scrollEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(375, 800);
}

Ответ 19

Моя проблема была решена с помощью:

  1. установка contentSize на scrollView на большую высоту
  2. НО также я должен был исправить верхние и/или нижние ограничения для представлений в scrollView, что означало, что индикаторы прокрутки показывались на экране, но содержимое не прокручивалось

После того, как я удалил верхние и/или нижние ограничения, связанные с безопасной областью и/или суперпредставлением, представления внутри scrollView снова могли прокручиваться и не оставались фиксированными в верхней части нижней части экрана!

Надеюсь, что это остановит кого-то еще от часов боли с этой конкретной проблемой.

Ответ 20

После отказа от предоставленных ответов в этой теме я наткнулся на эту статью с решением.

Есть две вещи, которые не интуитивно понятны в настройке scrollview с автоопределением:

  • Ограничения, которые вы задали как margin между contentview и scrollview, не влияют на размер содержимого. Они действительно являются маржами. Чтобы заставить его работать, контент должен иметь фиксированный размер.
  • Уловкой фиксированного размера является то, что вы можете установить ширину содержимого, равную ширине содержимого родительского элемента scrollview. Просто выберите оба вида в дереве слева и добавьте ограничение равной ширины.

Это суть этой статьи. Для полного объяснения, включая иллюстрации, проверьте его.

Ответ 21

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

Ответ 22

Я сделал это с первой попытки. С автоматической разметкой и всем, без дополнительного кода. Затем представление коллекции стало банальным, сбой во время выполнения, я не смог найти, что было не так, поэтому я удалил и воссоздал его (я использую Xcode 10 Beta 4. Это было похоже на ошибку), а затем прокрутка исчезла. Представление Коллекции работало снова, все же!

Много часов спустя.. это то, что исправило это для меня. У меня был следующий макет:

UIView

  • Безопасный район
  • Вид прокрутки
    • Просмотр содержимого

Это все в ограничениях. Безопасная зона автоматически определяется системой. В худшем случае удалите все ограничения для видов прокрутки и содержимого и не создавайте для них сброс/создание IB. Сделай их вручную, все работает.

  • Для просмотра с прокруткой я сделал: Выровнять Трейлинг/Верх в Безопасную область Равная Ширина/Высота в Безопасной области.
  • Для просмотра содержимого я сделал: выровнять трейлинг/ведущий/верхний/нижний к суперпредставлению (вид с прокруткой)

По сути, концепция состоит в том, чтобы иметь представление контента, соответствующее Scrollview, который подходит для Safe Area.

Но как таковой это не сработало. Содержание просмотра пропустило высоту. Я перепробовал все, что мог, и единственное, что делало трюк, это высота представления контента, созданная перетаскиванием элемента управления представлением контента... в себя. Это определило фиксированную высоту, значение которой было вычислено из размера контроллера представления (определяется как произвольная форма, длиннее, чем реальное отображение, чтобы содержать все мои подпредставления), и, наконец, это снова заработало!

Ответ 23

У меня была такая же проблема в IB.

После установки начала, конца, верха и низа scrollView в его superView. Я сделал следующие изменения, чтобы сделать прокручиваемый контейнер, который работал.

Чтобы сделать scrollView только прокруткой в горизонтальном направлении, установите ограничение с scrollView centerY = ContainerView centerY

и чтобы сделать его вертикально прокручиваемым, сделайте scrollView centerX = ContainerView centerX

Ответ 24

еще один забавный случай:

scrollview.superview.userInteractionEnabled должно быть истинным

Я потратил 2 часа в погоне за этим, просто чтобы выяснить, что родитель UIImageView, который, естественно, имеет userInteractionEnabled == false