2013-12-11 5 views
8

У меня действительно большая проблема с UIScrollView. Чтобы убедиться, что это не мой фактический проект, я создал новый проект, только для iPhone, для iOS 6 и 7. I отключен автозапуск.UIScrollView setContentSize не работает

  1. Я создал проект Tab Bar
  2. я создал контроллер представления, внедренный его в навигационном контроллере и подключил его, как Tab бар пункт # 0
  3. Я положил UIScrollView на мой взгляд.
  4. Я подключил прокрутку в пользовательском UIViewController, созданном для этого представления.
  5. Я синтезировал свой IBOutlet и назначил делегат себе. Я также реализован делегат в .h

Вот мой код (ViewDidLoad):

self.scrollView.delegate = self; 
    [self.scrollView setScrollEnabled:YES]; 

    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)]; 


    NSLog(@"contentSize width %f", self.scrollView.contentSize.width); 
    NSLog(@"contentSize height %f", self.scrollView.contentSize.height); 

    NSLog(@"%@", NSStringFromCGAffineTransform(self.scrollView.transform)); 

Это возвращает меня "contentSize ширина +20000,000000", "contentSize высота 0,000000 " и «[1, 0 , 0, 1, 0, 0] ". Он прокручивает влево-вправо, где он должен прокручиваться вверх

Пожалуйста, помогите!

+1

Вы используете автозапуск? – Jumhyn

+0

Как указано в начале, я отключил его. Завершает слишком много вещей в приложении – anthoprotic

+0

Разве вы не хотите, чтобы журнал читал 20000 для высоты и 0 для ширины? – bilobatum

ответ

4

В методе viewDidLoad, рамка не может быть правильным, переместим код этого метода:

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    // Your code 

} 
+0

Ничего не изменил, к сожалению. – anthoprotic

+0

Также проверьте ориентацию – quaertym

+0

Что значит? Мой scrollview занимает все пространство на моем ViewController – anthoprotic

3

Хорошо, нет абсолютно ничего плохого с кодом. Таким образом, некоторые предложения:

  1. Убедитесь, что вы добавили в свой файл .h следующим образом:

    @interface yourViewController : UIViewController <UIScrollViewDelegate> { 
    
    } 
    
  2. Попробуйте переместить этот фрагмент кода в метод "viewWillLoad":

    - (void)viewWillAppear:(BOOL)animated { 
        self.scrollView.delegate = self; 
        [self.scrollView setScrollEnabled:YES]; 
    
        [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)]; 
    } 
    
+0

Я знаю правильно! Вот что действительно расстраивает. Я пробовал свой путь, но viewWillLoad не вызывается. Никогда. – anthoprotic

+0

Я создал совершенно новый проект только для проверки моего кода UIScrollView (например, выше). Ничто не может быть повреждено. Может ли это быть установкой в ​​моем .plist, который все еще считает, что автозапуск активирован? Я использую Xcode 5.0.2 – anthoprotic

+0

Вы отключили автозапуск для всех ваших контроллеров вида в раскадровке? – quaertym

36

У меня была такая же проблема, пока я не понял, что я не установил делегат UIScrollView. Кроме того, если вы используете автоматическую компоновку, вам нужно подождать, пока макет будет применен к UIScrollView. Это означает, что вы должны установить размер содержимого в «viewDidLayoutSubviews».

+0

Спасибо! Я не получил свой scrollview для работы, пока не прочитал ваш ответ и не установил размер содержимого в viewDidLayoutSubviews. – Eloy

+0

Настройка свойства contentSize в viewDidLayoutSubviews сработала для меня. Не имеет ничего общего с автоматической компоновкой. – Alyoshak

+0

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

3

Используйте этот код. ScrollView setContentSize следует вызывать async в основном потоке.

- (void)viewDidLayoutSubviews 
     { 

     [super viewDidLayoutSubviews]; 

     dispatch_async(dispatch_get_main_queue(),^
         { 
          CGRect contentRect = CGRectZero; 
          for (UIView *view in scrollView.subviews) 
           if (!view.hidden) 
            contentRect = CGRectUnion(contentRect, view.frame); 

          contentRect.size.height=contentRect.size.height; 
          scrollView.contentSize = contentRect.size; 
         }); 
     } 
+0

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

0
override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    var contentRect = CGRect.zero 
    for view: UIView in scrollView.subviews { 
     if !view.isHidden { 
      contentRect = contentRect.union(view.frame) 
     } 
    } 
    contentRect.size.height = contentRect.size.height 
    scrollView.contentSize = contentRect.size 
    scrollView.contentSize.width = self.view.frame.width 
} 

Рабочая Свифт 3.X код. Преобразованный ответ Армении.

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