Atteindre un UIBlurEffect uniforme dans la vue primaire d'un UISplitView

J'utilise un stock UISplitViewController avec des controllers de vue Master et Detail UISplitViewController à l' UISplitViewController . Dans un storyboard, j'ai ajouté un UIImageView au jeu de controllers de Detail pour remplir efficacement la vue avec une seule image.

Dans le controller Master , j'ai utilisé ce qui suit pour brouiller l'arrière-plan de ce controller:

 // In viewDidLoad self.tableView.backgroundColor = [UIColor clearColor]; UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; self.tableView.backgroundView = visualEffectView; self.tableView.separatorEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect]; 

Lorsque le controller Master apparaît au-dessus du controller de Detail , notez comment les bords du controller Master ont une ombre foncée autour des bords internes.

Comment ces "ombres" peuvent-elles être enlevées pour rendre un flou uniforme?

Contrôleur de vue partagée

Plus de détails

UIPopoverSlidingChromeView

Le debugging de la hiérarchie de vue dans IB révèle une vue ( privée? ) Appelée _UIPopoverSlidingChromeView . Il a un cadre gris incrusté, et c'est certainement ce qui est responsable de l'apparence de flou non uniforme.

Désactivation totale de la vue de flou et abandon de self.tableview.backgroundColor = [UIColor clearColor] affiche le cadre gris de _UIPopoverSlidingChromeView . Cela ressemble à ceci:

Rendu UIPopoverSlidingChromeView

Des reflections sur la façon d'éviter _UIPopoverSlidingChromeView lors de l'utilisation de UISplitViewController ?

Le problème est que c'est une class privée que vous ne pouvez pas tester.

Heureusement _UIPopoverSlidingChromeView est la sous-class de UIPopoverBackgroundView qui est publique (parce que dans le stream de mise en œuvre de popover régulière, le client peut personnaliser le chrome d'arrière-plan popover en fournissant une class qui sous-class UIPopoverBackgroundView ) .

 for (UIView *subview in self.viewController.view.superview.superview.subviews) { if ([subview isKindOfClass:[UIPopoverBackgroundView class]]) { subview.alpha = 0.0; } } 

Cela devrait cacher le _UIPopoverSlidingChromeView .

  //как убрать дурацкий прямоугольник при прозрачном фоне maser окна в режиме UISplitViewControllerDisplayModeOverlay CALayer* v_1 = self.view.superview.superview.superview.layer.sublayers[0]; CALayer* v_2=v_1.sublayers[0]; v_2.borderWidth=0;