2

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

似乎有类似问题的人有解决方案,如设置

self.automaticallyAdjustsScrollViewInsets = NO;

或者只是隐藏状态栏

- (BOOL)prefersStatusBarHidden {
    return YES;
}

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

问题

由于我有很多来自Ray Wenderlich 的本教程的代码,而且我不知道问题在我的代码中的确切位置,这是 github 上代码的链接

谁能帮我?

4

2 回答 2

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,它会像你预期的那样工作。

如果您有更多问题,请告诉我。

希望这可以帮助!

于 2013-11-14T00:31:13.187 回答
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];

当您有一个带有 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];
于 2015-05-12T14:46:25.650 回答