iOS 7: Custom container view controller and content inset

前端 未结 6 618
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-01 05:15

I have a table view controller wrapped in a navigation controller. The navigation controller seems to automatically apply the correct content inset to the table view controller

6条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-02-01 05:45

    I've had a similar problem. So on iOS 7, there is a new property on UIViewController called automaticallyAdjustsScrollViewInsets. By default, this is set to YES. When your view hierarchy is in any way more complicated than a scroll/table view inside a navigation or tab bar controller, this property didn't seem to work for me.

    What I did was this: I created a base view controller class that all my other view controllers inherit from. That view controller then takes care of explicitly setting the insets:

    Header:

    #import 
    
    @interface SPWKBaseCollectionViewController : UICollectionViewController
    
    @end
    

    Implementation:

    #import "SPWKBaseCollectionViewController.h"
    
    @implementation SPWKBaseCollectionViewController
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        [self updateContentInsetsForInterfaceOrientation:self.interfaceOrientation];
    }
    
    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
        [self updateContentInsetsForInterfaceOrientation:toInterfaceOrientation];
    
        [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    }
    
    - (void)updateContentInsetsForInterfaceOrientation:(UIInterfaceOrientation)orientation
    {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            UIEdgeInsets insets;
    
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
                insets = UIEdgeInsetsMake(64, 0, 56, 0);
            } else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
                if (UIInterfaceOrientationIsPortrait(orientation)) {
                    insets = UIEdgeInsetsMake(64, 0, 49, 0);
                } else {
                    insets = UIEdgeInsetsMake(52, 0, 49, 0);
                }
            }
    
            self.collectionView.contentInset = insets;
            self.collectionView.scrollIndicatorInsets = insets;
        }
    }
    
    @end
    

    This also works for web views:

    self.webView.scrollView.contentInset = insets;
    self.webView.scrollView.scrollIndicatorInsets = insets;
    

    If there is a more elegant and yet reliable way to do this, please let me know! The hardcoded inset values smell pretty bad, but I don't really see another way when you want to keep iOS 5 compatibility.

提交回复
热议问题