UIScrollView не прокручивается



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



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



спасибо

849   21  

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 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 правильно, убедитесь, что вы убрать "использовать автозапуск" в Interface Builder -> File Inspector.

вам нужно установить contentSize свойство вида прокрутки для его правильной прокрутки.

если вы используете autolayout, вам нужно установить contentSize in 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
    );
}

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

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

enter image description here

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

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 является подвидом a 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 с autolayout:

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

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

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

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

UIView

  • Безопасная Площадью
  • посмотреть свиток
    • просмотр содержимого

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

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

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

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

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

Comments

    Ничего не найдено.