2013-11-13 4 views
2

У меня есть UIScrollView, который содержит UIView, который, в свою очередь, имеет UIImageView и несколько UIButtons в нем. Проблема заключается в том, что изображение отображается около 20 пикселей под моей навигационной панелью.Содержимое UIScrollView имеет смещение ниже панели навигации

Люди, которые, кажется, имеют аналогичные проблемы были решения, как установка

self.automaticallyAdjustsScrollViewInsets = NO; 

или просто скрыть строку состояния

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

Однако оба решения не работают для меня. Первый устанавливает слишком высокое содержимое и добавляет пространство 20px внизу. Второй скрывает строку состояния, но смещение все еще остается.

problem

Поскольку у меня есть много кода из this tutorial by Ray Wenderlich, и я понятия не имею, где именно в моем коде проблема заключается, this is the link to code on github.

Может ли кто-нибудь мне помочь?

ответ

1

Мне удалось выяснить, что происходит. Спасибо, что разместили ссылку на свое приложение.

Вопрос заключается в следующем коде:

if (contentsFrame.size.height < boundsSize.height) { 
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
} else { 
    contentsFrame.origin.y = 0.0f; 
} 

Оказывается contentsFrame.size.height фактически меньше, чем bounds.Size.height при первом отображении карты. Таким образом, ваш код центрирует изображение по вертикали. Вот почему вы видите это смещение вверху. 17,279 пикселей, если быть точным.

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

Дайте мне знать, если у вас есть еще вопросы.

Надеюсь, это поможет!

+0

Большое спасибо, это действительно проблема! Я все еще немного смущен, почему, если вид прокрутки больше, чем содержимое, я не вижу белого пространства наверху И внизу, потому что это то, что я думал, что метод будет делать в этом случае. Но я удалил его сейчас, и он работает, как я хочу! – freda42

+0

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

+0

Эй, извините, я только вчера видел ваш комментарий! Я всегда стараюсь улучшаться, поэтому вклад людей с большим опытом, чем я, всегда ценится! Я также относительно новичок в github, поэтому я не уверен, что лучший способ привлечь кого-то. В файле readme есть несколько вещей, над которыми я все еще хочу работать/нужна помощь. Я бы очень признателен за добавленную информацию! – freda42

0

Правильным решением является один из @LuisCien

Я добавляю здесь, что я нашел, что это полезно при использовании UIScrollView с MPMediaPickerController, так:

- (void)fixViewFrameBoundSize { 
    CGRect contentsFrame = self.view.frame; 
    CGSize boundsSize = self.view.bounds.size; 
    if (contentsFrame.size.height < boundsSize.height) { 
     contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
    } else { 
     contentsFrame.origin.y = 0.0f; 
    } 
    [self.view setFrame:contentsFrame]; 
} 

и

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker { 
[self dismissViewControllerAnimated:YES completion:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self fixViewFrameBoundSize]; 
    }); 
}]; 

}

и то же для обратного вызова выбранных элементов:

[self dismissViewControllerAnimated:YES 
         completion:^{ 

          //LP : get item url and play 

          dispatch_async(dispatch_get_main_queue(), ^{ 
           [self fixViewFrameBoundSize]; 
          }); 

          MPMediaItem *item = [collection representativeItem]; 

Это решение работает хорошо, когда у вас есть XIB с UIView, и превратить его в UIScrollView следующим образом:

- (void)scrollViewMakeScrollable { 
     CGSize scrollableSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height+44.0); 
     [((UIScrollView*)self.view) setContentSize:scrollableSize]; 
     [((UIScrollView*)self.view) setAlwaysBounceHorizontal:NO]; 
     [((UIScrollView*)self.view) setAlwaysBounceVertical:NO]; 
     self.automaticallyAdjustsScrollViewInsets = NO; 

}

Так обычно, когда вы делаете как

- (void) viewDidLoad { 

    [super viewDidLoad]; 

     [self scrollViewMakeScrollable]; 
Смежные вопросы