Chris Droukas Chris Droukas - 6 months ago 37
iOS Question

Achieve a Uniform UIBlurEffect in the Primary View of a UISplitView

I'm using a stock

UISplitViewController
with out-of-the-box
Master
and
Detail
view controllers. In a storyboard, I've added a
UIImageView
to the
Detail
controller set to effectively fill the view with a single image.

In the
Master
controller, I've used the following to blur the background of that 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];


When the
Master
controller appears above the
Detail
controller, note how the edges of the
Master
controller have a dark shadow around the inner edges.

How can these "shadows" be removed to instead render a uniform blur?

Split View Controller

More Details



UIPopoverSlidingChromeView

Debugging the view hierarchy in IB reveals a (private?) view called
_UIPopoverSlidingChromeView
. It has an inset grey frame, and it's definitely what's responsible for the non-uniform blur appearance.

Disabling the blur view altogether and just leaving
self.tableview.backgroundColor = [UIColor clearColor]
shows
_UIPopoverSlidingChromeView
's grey frame. It looks like this:

Rendered UIPopoverSlidingChromeView

Any thoughts on how to avoid
_UIPopoverSlidingChromeView
when using
UISplitViewController
?

Answer

The problem is that it is a private class that you can't test against, but fortunately _UIPopoverSlidingChromeView is the subclass of UIPopoverBackgroundView that is public.

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

This should hide the _UIPopoverSlidingChromeView.

Comments