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

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

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

благодаря

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

 // 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 ); } 

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

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

введите описание изображения здесь

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

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

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

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

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

Снимите флажок «Использовать Autolayout» сделал трюк для меня.

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

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

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

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

добро пожаловать 🙂

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

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

Задайте свойство contentSize UIScrollview в ViewDidLayoutSubviews . Что-то вроде этого

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height) } 

если вы получаете сообщение (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 спонтанно изменил тип на UIView , хотя его class сказал UIScrollView в инспекторе. Я использую Xcode 5.1 (5B130a) .

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

Оригинал:

  ...  

После того, как тип спонтанно изменился:

  ...  

Поэтому я заменил строку моей исходной .

Я также заменил тег закрытия тега на .

Обязательно сохраните идентификатор так же, как текущий вид, в данном случае: id = “qRn-TP-cXd”.

Я также должен был очистить xib от кеша Xcode, удалив полученные данные приложения:

  • Xcode->Window->Organizer->Projects , выберите свой проект, в строке «Производные данные» нажмите «Удалить» …

Или при использовании устройства:

  • Xcode->Window->Organizer->Device , выберите ваше устройство-> Приложения, выберите свое приложение, нажмите (-)

Теперь очистите проект и удалите приложение из симулятора / устройства:

  • Xcode->Product->Clean
  • iOS Simulator/device->press и удерживайте app->click по (X), чтобы удалить его

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

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

Если ваш scrollView является 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 ()  -(void)viewDidAppear:(BOOL)animated { self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; self.scrollView.contentSize = CGSizeMake(375, 800); } 

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

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

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

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

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

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

UIView

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

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

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

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

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

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

  • Как прокрутить UITableView в определенную позицию
  • Сохранять uitableview static при вставке строк вверху
  • Центральное содержимое UIScrollView при меньшем
  • Изучение основ UIScrollView
  • Как включить масштабирование в UIScrollView
  • UIScrollView. Любые мысли о реализации «бесконечной» прокрутки / масштабирования?
  • Есть ли хорошие полезные учебные пособия UIScrollView в сети?
  • Прокрутка UITableView внутри UIScrollView
  • UIScrollView не использует ограничения автоопределения
  • UIScrollView приостанавливает NSTimer до тех пор, пока прокрутка не завершится
  • как использовать UIScrollView в Interface Builder?
  • Давайте будем гением компьютера.