UIScrollView не прокручивается - PullRequest
121 голосов
/ 13 мая 2010

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

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

Спасибо

Ответы [ 24 ]

3 голосов
/ 15 февраля 2014

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

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

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

3 голосов
/ 08 января 2015

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

override func viewDidAppear(animated: Bool)

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

2 голосов
/ 11 ноября 2016

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

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

2 голосов
/ 09 июля 2014

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

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

//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
1 голос
/ 02 ноября 2018

Моя проблема была решена:

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

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

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

1 голос
/ 24 июля 2018

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

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

UIView

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

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

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

По сути, концепция состоит в том, чтобы представление контента соответствовало Scrollview, которое соответствует Безопасной области.

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

1 голос
/ 08 мая 2014

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

В какой-то момент в последние несколько дней мой 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.

1 голос
/ 20 февраля 2016

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

@interface testScrollViewController () <UIScrollViewDelegate>

-(void)viewDidAppear:(BOOL)animated {
    self.scrollView.delegate = self;
    self.scrollView.scrollEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(375, 800);
}
1 голос
/ 04 декабря 2015

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

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

}

//set the height of content size as required
1 голос
/ 10 августа 2015

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

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