iOS 7——navigationController 正在设置我的 UIScrollView 的 contentInset 和 ContentOffset

Posted

技术标签:

【中文标题】iOS 7——navigationController 正在设置我的 UIScrollView 的 contentInset 和 ContentOffset【英文标题】:iOS 7 -- navigationController is setting the contentInset and ContentOffset of my UIScrollView 【发布时间】:2013-09-26 07:03:26 【问题描述】:

我有一个 UIScrollView(实际上是一个 UICollectionView,但这可能无关紧要)。当它出现在 ios 7 中时,导航控制器将其 contentInset 和 contentOffset 设置为我不想要的值。它似乎正在尝试调整状态栏和导航栏。我非常希望它让他们一个人呆着。我已经通过覆盖 contentInset 和 contentOffset 的 getter 和 setter 方法来解决这个问题,并带有一个标志来告诉对象它是否应该接受一个集合。但是有没有更好的方法?

【问题讨论】:

【参考方案1】:

尝试在主视图控制器中设置self.automaticallyAdjustsScrollViewInsets = NO

这是在 iOS 7 中引入的,因此如果您支持 iOS 6 及以下版本,您可能需要使用 iOS 版本检查来包装它。


更新

如果您使用情节提要,您可以在 Interface Builder 中执行此操作,也可以通过为您选择的控制器检查 'Adjust Scroll View Insets'

【讨论】:

只有在使用情节提要时才能在 IB 上设置。 残酷的是IB显示这个配置不正确;即使打开此标志,它也会在 IB 中显示为关闭标志。如果您随后启动模拟器,该标志会按预期工作,这会让您完全感到困惑 -.- 一个邪恶的设置! :-) 我花了一天时间弄清楚为什么我的 ImageView 不是以我的滚动视图为中心的左上角。关闭此选项后,一切正常! 这个“调整滚动视图插图”选项有什么作用? @KDaker - 我和 Yakiv 在同一条船上......这解决了我的问题(谢谢!!!)但我想知道该选项首先在做什么并且在其他地方没有找到任何好的信息。谢谢!【参考方案2】:

我遇到了类似的问题,在关闭 viewController 后,tableView 中的 contentOffset 更改为 (0, -64)。

我的解决方案有点奇怪,我尝试了所有其他答案但没有成功,唯一解决我的问题是在 .xib 的控件树中切换 tableView 位置

它是父视图中的第一个控件,如下所示:

我在 ImageView 之后移动了 tableView 并且它起作用了:

似乎将表格视图放在第一个位置会导致问题,将表格视图移动到另一个位置可以解决问题。

P.D.我没有使用 autoLayout 也没有故事板

希望这可以帮助某人!

【讨论】:

也是我的问题,iOS 7 错误? 你是明星!从来没有想过滚动视图的顺序可能是问题。 接受的答案暗示了发生这种情况的原因。 UIViewController 会自动设置第一个 UIView 的 contentInset。通过使 UITableView 成为第二个视图,它不会自动设置它的 contentInset。 迈克尔,不幸的是,这不是真的。在我的情况下,控制器属性没有被检查(假),但我仍然得到了奇怪的插图。在 viewWillAppear 中将插图更改为 0 的事件没有帮助。但是在视图层次结构中移动它会有所帮助。真是奇怪的错误。 谢谢!我永远不会发现,我实际上必须在 ViewController 中添加一个空视图才能进行此修复。【参考方案3】:

我有两个解决方案:

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];

【讨论】:

谢谢你,我需要NavigationBar,而不是第二个示例中的NavigationBar,就像navigationController.NavigationBar.Translucent = false;(注意:Xamarin)一样有效。【参考方案4】:

这就够了

- (void)viewDidLoad 

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

【讨论】:

【参考方案5】:

我也有同样的问题。

    设置 self.automaticallyAdjustsScrollViewInsets = NO 解决了某些视图的问题,但不是所有视图。

    第二种方案是在viewWillLayoutSubviews中设置tableview/view/scrollview的content-offset:

    - (void)viewWillLayoutSubviews 
        //Arrange the view
        CGRect tempViewFrame = self.view.frame;
    
        if (tempViewFrame.origin.y == 64.0f) 
            tempViewFrame.origin.y = 0;
            self.view.frame = tempViewFrame;
        
    
    

【讨论】:

【参考方案6】:

这解决了两种情况下的问题:

    显示状态栏

    显示状态栏+导航栏

    override func viewDidLayoutSubviews() 
            NSLog("ORIGIN: \(self.view.frame.origin.y)")
    
        if self.view.frame.origin.y == 0 
            if let rect = self.navigationController?.navigationBar.frame 
                let y = rect.size.height + rect.origin.y
                self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
            
         else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 
            self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
        
    
    

【讨论】:

【参考方案7】:

其他答案可能对你有用,但对我没有用。对我有用的是在viewDidLayoutSubviewsviewWillAppear 中手动设置contentOffsety 属性:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height


override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height

在我的例子中,我的控制器有一个子集合视图,它有时会调整 contentOffset,有时则不会。我标准化的方式是每次手动调整它。我希望内容偏移到状态栏下方,所以我使用状态栏高度作为值(负值,因为我希望内容被下推)。

【讨论】:

以上是关于iOS 7——navigationController 正在设置我的 UIScrollView 的 contentInset 和 ContentOffset的主要内容,如果未能解决你的问题,请参考以下文章

ios 7 半透明+彩色导航栏

如何在 iOS 7 中使导航栏透明? [复制]

iOS 7 导航栏

iOS: NavigationController: BarBackButtonItem 影响宽度

iOS 禁用 NavigationController 后退按钮的动画

ios:关于 NavigationController 的问题。强制与否?