getting UIView in separate class for FXBlurView

2019-07-25 12:02发布

I am using FXBlurView but I am receiving a weird black line at the top when animating the blurView down.

I have a UITable that is 3/4 up the ViewController and an image that is the rest. What is happening Is that it is only picking up the UITable and not the image, in the superview. So is there a way to get the superview to pick up both? or a replacement?

enter image description here

I have read that this can be fixed by replacing the superview with the actual UIView

FXBlurView captures the contents of its immediate superview by default. If the superview is transparent or partially transparent, content shown behind it will not be captured. You can override the underlyingView property to capture the contents of a different view if you need to.

The FXBlurView.m code is:

- (UIView *)underlyingView
{
    return _underlyingView ?: self.superview;
}

I have tried this:

((FXBlurView *)self.Genres).underlyingView = _main_view;

but this makes no difference

where ImagesTableViewController is my main ViewController containing the Blured Uiview and the one I want to replicate (main_view)

But this just creates a white page for the Blured Uiview.

1条回答
做自己的国王
2楼-- · 2019-07-25 12:51

First off you shouldn't need to edit the FXBlurView source at all.

Secondly I guess the black bar is part of the view hierarchy that isn't getting picked up. Maybe a navbar? You might try adding the blur view to the window rather than the view so you grab everything:

[[[UIApplication sharedApplication] keyWindow] addSubview: blurView];

Failing that the only hack I can think would be to make an imageView that grabs its image using the window like:

- (UIImage *)screenGrab:(id) theView {

   CGRect rect = [self.view bounds];

    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [theView.layer renderInContext:context];   
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

with:

[self screenGrab: [[UIApplication sharedApplication] keyWindow]];

Then set imageView.image to the grabbed image and set this as the underlying view. You shouldn't need to do this though :)

Failing that I'd need to see a bit more code to understand the view hierarchy.

查看更多
登录 后发表回答