UIScrollView的内容偏移到导航栏下方

时间:2013-11-13 22:32:31

标签: ios objective-c uiscrollview offset statusbar

我有一个UIScrollView,它包含一个UIView,后者又有一个UIImageView和几个UIButtons。 我遇到的问题是图像显示在导航栏下方大约20 px。

似乎有类似问题的人有像设置

这样的解决方案
self.automaticallyAdjustsScrollViewInsets = NO;

或只是隐藏状态栏

- (BOOL)prefersStatusBarHidden {
    return YES;
}

然而,这两种解决方案对我都不起作用。第一个设置内容太高,而在底部添加20px空间。第二个隐藏状态栏,但偏移仍然存在。

problem

由于我有很多来自this tutorial by Ray Wenderlich的代码,而且我不知道代码中究竟存在哪个问题,this is the link to code on github

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分: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的两次调用,它会像你期望的那样工作。

如果您有更多问题,请与我们联系。

希望这有帮助!

答案 1 :(得分:0)

正确的解决方案是来自@LuisCien

的解决方案

我在这里添加我发现在使用带有MPMediaPickerController的UIScrollView时它很有用,所以:

- (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];

当你有一个带有UIView的XIB时,这个解决方案很有效,你可以在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];