Search code examples
iosswiftuinavigationbarnavbarios11

ios 11 transparent navigation bar


Creating a transparent navigation bar no longer works with ios 11. I get this black bar at the top because the table view doesn't come under the bar anymore (the insets in the storyboard are set properly to start from 0) Any ideas why?

enter image description here

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

Solution


  • old:

    if you have used tableView,add code:

    if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO
    }
    

    new:

    a change of automaticallyAdjustsScrollViewInsets in iOS11:

    @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets 
    API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's 
    contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); 
    // Defaults to YES
    

    about contentInsetAdjustmentBehavior:

    typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
        UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
        UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
        UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
        UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
    } API_AVAILABLE(ios(11.0),tvos(11.0));
    
    /* Configure the behavior of adjustedContentInset.
     Default is UIScrollViewContentInsetAdjustmentAutomatic.
     */
    @property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));
    

    it could be a problem of safeArea for iOS11. try this define from one expert:

    #define  adjustsScrollViewInsets_NO(scrollView,vc)\
    do { \
        _Pragma("clang diagnostic push") \
        _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
            if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
                [scrollView   performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
            } else {\
                vc.automaticallyAdjustsScrollViewInsets = NO;\
            }\
        _Pragma("clang diagnostic pop") \
    } while (0)