21 ответов:
это всегда хорошо, чтобы показать полный рабочий фрагмент кода:
// 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 sizeSwift 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 правильно, убедитесь, что вы убрать "использовать автозапуск" в Interface Builder -> File Inspector.
вам нужно установить
contentSizeсвойство вида прокрутки для его правильной прокрутки.если вы используете autolayout, вам нужно установить
contentSizeinviewDidLayoutSubviewsдля того, чтобы он был применен после завершения автозапуска.код может выглядеть так:
-(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 ); }
ответ выше правильный - чтобы сделать прокрутку, необходимо установить размер содержимого.
Если вы используете interface builder, аккуратный способ сделать это-с пользовательскими атрибутами времени выполнения. Например:
попробуйте изменить размер содержимого до огромных чисел. Я не мог понять, почему мой вид прокрутки не прокручивается, даже если его размер содержимого кажется больше размера элемента управления. Я обнаружил, что если размер содержимого меньше, чем необходимо, он также не работает.
self.scrollView.contentSize = CGSizeMake(2000, 2000);вместо 2000 Вы можете поставить свои собственные большие числа. И если это работает, это означает, что размер вашего контента недостаточно велик при изменении размера.
делегат не требуется для прокрутки вид для работы.
убедитесь, что свойство contentSize вида прокрутки установлено на правильный размер (т. е. один достаточно большой, чтобы охватить все содержимое.)
снимите флажок "Использовать автозапуск" сделал трюк для меня.
окружающая среда: в Xcode 5.0.2 Раскадровки с iOS7
в моем случае я должен был поставить
delaysContentTouchesк true, потому что объекты внутри scrollView все захватывали события касания и обрабатывали себя, а не позволяли самому scrollView обрабатывать его.
идея о том, почему вид прокрутки не прокручивается, потому что вы устанавливаете размер содержимого для прокрутки меньше, чем размер вида прокрутки, что неверно. Вы должны установить размер содержимого больше, чем размер вашей прокрутки, чтобы перемещаться по нему во время прокрутки.
та же идея с масштабированием, вы устанавливаете минимальное и максимальное значение для масштабирования, которое будет применяться через масштабирование действия.
добро пожаловать :)
одно небольшое дополнение, все выше приведены фактические причины, по которым ваш вид прокрутки может не прокручиваться, но иногда бездумно это может быть причиной, особенно когда scrollview добавляется через код, а не IB, вы могли бы добавить свои подвиды в родительский вид, а не в scrollview это приводит к тому, что подвиды не прокручиваются
и сохранить размер контента установлен и больше, чем родительский вид кадра (duhh!!)
Set
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 может не быть подключен - так что дважды проверьте! Наведите курсор на круг и посмотрите, будет ли выделен фактический 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, хотя его класс сказалUIScrollViewв инспекторе. Я используюXcode 5.1 (5B130a).вы можете либо создать новый вид прокрутки и скопировать измерения, настройки и ограничения из старого вида, либо вы можете вручную измените свой вид на
UIScrollViewна . Я сделал сравнение и нашел следующие различия:Оригинал:
<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.
если
scrollViewявляется подвидом acontainerViewкакого-то типа, а затем убедитесь, что ваш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 с autolayout:
- ограничения, которые вы устанавливаете в качестве поля между contentview и scrollview, не влияют на размер contentview. Они действительно прибыли. И чтобы он работал, contentview должен иметь фиксированный размер.
- хитрость фиксированный размер заключается в том, что вы можете установить ширину contentview равной ширине родительского элемента scrollview. Просто выберите оба вида в дереве слева и добавьте ограничение равной ширины.
Это суть этой статьи. Для полного объяснения, включая иллюстрации, проверьте его.
Я сделал это работает с моей первой попытки. С автоматической компоновкой и все такое, без дополнительного кода. Затем представление коллекции пошло бананом, сбой во время выполнения, я не мог найти, что было не так, поэтому я удалил и воссоздал его (я использую Xcode 10 Beta 4. Это было похоже на ошибку), а затем прокрутка исчезла. Однако представление коллекции снова сработало!
много часов спустя.. это фиксированная это для меня. У меня было следующее макет:
UIView
- Безопасная Площадью
- посмотреть свиток
- просмотр содержимого
все дело в ограничениях. Безопасная зона определяется системой автоматически. В худшем случае удалите все ограничения для просмотра прокрутки и содержимого и сделайте не есть IB сброс / создание их для вас. Сделайте их вручную, это работает.
- для просмотра прокрутки я сделал: выровнять трейлинг / топ в безопасную зону. Равная Ширина / Высота к безопасной зоне.
- для просмотра контента я сделал:выровнять трейлинг / ведущий/верхний / нижний для просмотра (вид прокрутки)
в основном концепция заключается в том, чтобы иметь вид контента, соответствующий Scrollview, который соответствует безопасной области.
но как таковой он не работает. Просмотр содержимого пропустил высоту. Я пробовал все, что мог, и только один делает трюк был просмотр содержимого высоте создано представление содержимого перетаскивания элемента управления.. к себе. Это определило фиксированную высоту, значение которой было вычислено из размера контроллера вида (определенного как freeform, длиннее реального дисплея, содержащего все мои подвиды), и, наконец, он снова работал!
я обнаружил, что с этой проблемой автозапуска... если я просто сделаю
ViewControllerиспользоватьUIViewвместоUIScrollViewдля класса... тогда просто добавьтеUIScrollViewсам... что это работает.

Comments