web-dev-qa-db-fra.com

barre de navigation transparente ios 11

La création d'une barre de navigation transparente ne fonctionne plus avec ios 11 . Je vois cette barre noire en haut car la vue du tableau n'apparaît plus sous la barre (les incrustations dans le storyboard sont définies correctement à partir de 0) Des idées pourquoi?

 enter image description here

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

vieux:

si vous avez utilisé tableView, ajoutez du code:

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

nouveau:

un changement de automatiquementAdjustsScrollViewInsets dans 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

à propos de 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));

il pourrait s'agir d'un problème de safeArea pour iOS11 .

#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)
16
5pers

J'ai rencontré le même problème et j'ai pu le résoudre. Voici ce qui fonctionne pour moi:

public override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.backgroundColor = UIColor.clear
    self.navigationController?.navigationBar.isTranslucent = true
    if #available(iOS 11.0, *) {
        collectionView.contentInsetAdjustmentBehavior = .never
    } else {
        // Fallback on earlier versions
    }
}

Et encore une chose, que j’ai trouvée nécessaire pour le faire fonctionner. Très probablement, votre UICollectionView/UITableView/UIScrollview est alignée sur le haut de la zone sécurisée. Modifiez cette contrainte pour qu'elle soit alignée sur le haut de la super vue.

 enter image description here

Et c'est tout. N'est-ce pas simple et intuitif? Merci Apple.

11
Wujo

J'ai eu un problème similaire. Je règle "Bords étendus: Sous Barre supérieure/inférieure/opaque" à Vrai pour UIViewController dans le storyboard . Comme ceci. Vous pouvez également essayer de désactiver " Ajuste automatiquement les incrustations d'affichage de défilement "

9

pour avoir un comportement cohérent entre iOS 10 et 11, essayez de l'ajouter à votre navigationViewController.

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {

    if navigationBar.isTranslucent, #available(iOS 11.0, *) {           
        viewController.additionalSafeAreaInsets.top = -navigationBar.bounds.height
    }
}
0
Hogdotmac