2016-09-18 3 views
3

ОБНОВЛЕНИЕ: Это проблема с iOS 10. Это все еще работает по-прежнему в iOS 9.iOS 10 Проблема: UIScrollView не прокручивается, даже когда ContentSize установлен

Это ... интересно.

Я просто конвертируюсь мой «обучающий проект» («игрушка» приложение) для Swift 3.

Он работал в течение нескольких лет под Swift 1.2.

Внезапно мой UIScrollView не прокручивается, даже когда я задал путь contentSize за его нижней границей.

Вот соответствующий код (подпрограмма displayTags вызывается с массивом изображений, отображаемых в центре и слегка вертикально смещенных, что приводит к вертикальной цепи):

/*******************************************************************************************/ 
    /** 
     \brief Displays the tags in the scroll view. 

     \param inTagImageArray the array of tag images to be displayed. 
    */ 
    func displayTags (inTagImageArray:[UIImage]) 
    { 
     self.tagDisplayView!.bounds = self.tagDisplayScroller!.bounds 
     if (inTagImageArray.count > 0) // We need to have images to display 
     { 
      var offset:CGFloat = 0.0 // This will be the vertical offset for each tag. 

      for tag in inTagImageArray 
      { 
       self.displayTag (inTag: tag, inOffset: &offset) 
      } 
     } 
    } 
    /*******************************************************************************************/ 
    /** 
     \brief Displays a single tag in the scroll view. 

     \param inTag a UIImage of the tag to be displayed. 
     \param inOffset the vertical offset (from the top of the display view) of the tag to be drawn. 
    */ 
    func displayTag (inTag:UIImage, inOffset:inout CGFloat) 
    { 
     let imageView:UIImageView = UIImageView (image:inTag) 
     var containerRect:CGRect = self.tagDisplayView!.frame // See what we have to work with. 
     containerRect.origin = CGPoint.zero 
     let targetRect:CGRect = CGRect (x: (containerRect.size.width - inTag.size.width)/2.0, y: inOffset, width: inTag.size.width, height: inTag.size.height) 
     imageView.frame = targetRect 
     containerRect.size.height = max ((targetRect.origin.y + targetRect.size.height), (containerRect.origin.y + containerRect.size.height)) 
     self.tagDisplayView!.frame = containerRect 
     self.tagDisplayView!.addSubview (imageView) 
     self.tagDisplayScroller!.contentSize = containerRect.size 
     print ("Tag Container Rect: \(containerRect)") 
     print (" Tag ScrollView Bounds: \(self.tagDisplayScroller!.bounds)") 
     inOffset = inOffset + (inTag.size.height * 0.31) 
    } 

Обратите внимание, что contentSize в Scrollview по расширяется каждый время добавления тега. Я проверил (см. Инструкции печати), и значение кажется правильным.

The project itself is completely open-source.

This is where this issue manifests (у меня есть другие ошибки, но я доберусь вокруг, чтобы фиксируя их после того, как я прибить этот).

Я уверен, что я делаю что-то очевидное и пронзительное (обычно дело).

У кого-нибудь есть идеи?

+0

Я думаю, что проблема с uiview, вы не установили высоту. – Do2

+0

Я проверю это. Высота устанавливается (и удаляется во время сборки) в раскадровке, но я не устанавливаю ее здесь. Вполне возможно, что вы правы. Я обнаружил, что недокументированные (или явно не заявленные) вещи часто меняются при обновлении ОС. Я тестировал это только в iOS 10. Интересно, будет ли он работать снова в iOS 9? Если это так, у меня есть другое приложение, которое мне тоже нужно будет настроить. Благодаря! –

+0

Ну, я только что проверил. Работает в 9,3, но не в 10. ОС представила Curveball. Высота устанавливается (см., Что я устанавливаю фрейм). Мне нужно выяснить, почему iOS 10 внезапно не нравится. Я делаю почти то же самое в другом приложении, и я обеспокоен. –

ответ

2

OK. Я решил это.

Я удаляю каждое ограничение автоматического макета для внутреннего (прокрученного) вида во время сборки.

Я предполагаю, что iOS 10, наконец, соблюдает контракт, заставляя верхнюю часть прокрученного вида прикрепляться к верхней части скроллера, даже если пользователь хочет его переместить.

+0

Вы удаляете все ограничения во время выполнения и имели успех? Я вижу ту же проблему, кроме использования Xamarin, где мой UIScrollView больше не имеет высоты после обновления до IOS 10. Я могу настроить выравнивание по вертикали для моего непосредственного дочернего представления, и оно показывает, но не позволит прокручивать. Удаление ограничения в ViewDidLoad вообще не влияет на это. – QckLrner

+1

TBH, я не совсем понял это. Это сработало для меня в этом случае. Однако в других случаях я использую классическую структуру, и она работает. Мне нужно потратить некоторое время на то, чтобы пробовать вещи. –

+0

Я установил демонстрационный проект Swift, чтобы проверить это. [Этот проект] (https://bitbucket.org/bmlt/testscroller) показывает это в действии. YMMV –

12

он будет работать, если вы установите contentSize на основной поток и поместить этот код в - (void)viewDidLayoutSubviews

- (void)viewDidLayoutSubviews 
{ 
    dispatch_async (dispatch_get_main_queue(),^
        { 
         [self.scrollview setContentSize:CGSizeMake(0, 2100)]; 
        }); 
} 
+0

Спасибо, я ценю подсказку и дал ей большие пальцы. К сожалению, хотя это абсолютно правильно, это было не решение. Проблема заключалась в том, что iOS 10 внезапно начала прикреплять прокрученные представления к контейнеру, если есть верхние и ведущие ограничения. Я удалил их во время сборки, и это решило. Опять же, спасибо. –

+0

Спасибо, он решил мою проблему ....! – Alessign

7

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

DispatchQueue.main.async { 
     self.scrollView.contentSize = CGSize(width: 2000, height: 2000) 
    } 

Это сработало для меня.

+0

Это работает для меня .. это абсолютно смешно, это не работает с viewDidAppear – quantumpotato

+0

Это также сработало для меня. Одна вещь, которую я должен упомянуть, - это похоже на то, что поведение iPad отличается от iPad, поскольку настройка contentSize в потоке пользовательского интерфейса работает просто отлично. – VSG24

Смежные вопросы