У мене є 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
методу.
myScrollView.delegate = self
ТАКОЖ, якщо це все ще не працює, відповідь нижче цього має ВЕЛИКІ поради (перейдіть на ваш xib / StoryBoard і переконайтесь, що функція "Автоматична розробка" відключена). Порада: Ви також можете включити <UIScrollViewDelegate>
у свій .h файл, якщо ви хочете робити такі речі, як програмне прокручування вашого UIScrollView.
viewDidLayoutSubviews
змусило мене працювати.
Якщо ви не можете прокрутити представлення даних навіть після того, як ви правильно встановили contentSize , переконайтесь, що зніміть прапорець "Використовувати автоматичну розкладку" в "Інтерфейсі" -> Інспектор файлів.
Вам потрібно встановити 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)
}
Ідея, чому перегляд прокрутки, не прокручується, оскільки ви встановлюєте розмір вмісту для прокрутки менше, ніж розмір подання прокрутки, що неправильно. Ви повинні встановити розмір вмісту, більший за розмір подання прокрутки, щоб переміщатися по ньому під час прокрутки.
У тій же ідеї зі збільшенням ви встановлюєте значення мінімального та максимального масштабування, яке застосовуватиметься через масштабування.
Ласкаво просимо :)
Одне невелике доповнення, все вище - це фактичні причини, через які подання прокрутки може не прокручуватися, але іноді безглуздо це може бути причиною, особливо якщо додаток прокрутки додається через код, а не ІБ, можливо, ви додали підпогляди до батьківського виду, а не перегляд прокрутки це призводить до того, що підвід не прокручується
і зберігайте набір розміру вмісту та більше, ніж батьківський кадр перегляду (так !!)
Я змусив це працювати з моєї першої спроби. З автоматичним компонуванням і всіма додатковими кодами. Потім перегляд колекції перейшов на банан, під час запуску він не зміг, я не міг знайти те, що не так, тому я видалив і відтворив його (я використовую Xcode 10 Beta 4. Це відчувало, як помилка), а потім прокрутка зникла. Перегляд колекції працював знову!
Через багато годин .. це те, що мені виправило. У мене був такий макет:
UIView
Це все в обмеженнях. Безпечна зона автоматично визначається системою. У гіршому випадку видаліть усі обмеження для перегляду прокрутки та вмісту і не потрібно скидати / створювати їх ІБ. Зробіть їх вручну, це працює.
По суті, концепція полягає у створенні перегляду вмісту, що відповідає Scrollview, який відповідає безпечній зоні.
Але як таке воно не спрацювало. Перегляд вмісту пропустив висоту. Я спробував усе, що міг, і єдиним, що робив трюк, був висота перегляду вмісту, створена контрольно-перетягувальним видом вмісту .. до себе . Це визначило фіксовану висоту, значення якої було обчислено з розміру контролера перегляду (визначається як вільна форма, довше реального дисплея, щоб містити всі мої підпогляди) і, нарешті, воно працювало знову!
Щось, про що раніше не згадували!
Переконайтесь, що ваша розетка правильно підключена до scrollView! У ньому повинно бути заповнене коло, але навіть якщо ви заповнили коло, scrollView може бути не підключений - тому подвійно перевірте! Наведіть курсор на коло та побачите, чи дійсно виділяється фактичний прокрутка! (Це стосувалося мене)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
Багато часу код правильний, якщо ви дотримувались підручника, але те, що багато початківців не знає, це те, що scrollView НЕ збирається прокручуватись нормально через тренажер. Припустимо, прокручувати лише тоді, коли ви натискаєте на клавіатуру миші та одночасно прокручуєте. Багато досвідчених користувачів 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
в Інтерфейсі.
У якийсь момент за останні кілька днів мій 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), щоб видалити йогоТоді ви зможете створити та запустити свою програму та знову мати функцію прокрутки.
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
себе ... що це працює.
У мене був такий самий випуск у ІБ.
Після встановлення провідного, останнього, верхнього і нижнього пункту scrollView на його супервигляд. Я вніс такі зміни, щоб контейнер ViewV прокручувався, який працював.
Щоб зробити scrollView лише прокрутку в горизонтальному напрямку, зробіть обмеження центром scrollViewY = центр ContainerViewY
і щоб зробити його вертикально прокручувальним, зробіть центр scrollViewX = центр ContainerViewX