TableView with image background and blur effect - swift - ios

I have a little problem: I'd like to set an image to background in a TableViewController. I tried this:
class SquadreController: UITableViewController {
override func viewDidLoad()
{
super.viewDidLoad()
var sfondo = UIImage(named: "sfondo")
self.view.backgroundColor = UIColor(patternImage: sfondo!)
}
Then I give the blur effect to the view, like this:
let blur = UIBlurEffect(style: UIBlurEffectStyle.Light)
let blurView = UIVisualEffectView(effect: blur)
blurView.frame = self.view.bounds
view.addSubview(blurView)
But there is a big problem. I'm working in a TableView and the TableView, TableCell, NavigationItem, etc. have all disappeared after I apply the blur. Can someone help me?
Thanks a lot!

Try using view.insertSubView(blurView, atIndex: 0) instead of view.addSubview(blurView) as! UIImageView

This question is an older question and Epic Defeater's response does in a way work, there is a much better way to accomplish this. Instead of adding blurView, you need to override the background view. Specifically you need to override tableView.backgroundView.
let blur = UIBlurEffect(style: .light)
let blurView = UIVisualEffectView(effect: blur)
blurView.frame = self.view.bounds
tableView.backgroundView = blurView
This will only work if you have set the background color to clear.

We can also add a subview below or above any other views using insertSubview
//Inserting below your subView
self.view.insertSubview(subview1_name, belowSubview: subview2_name)
//Inserting above your subView
self.view.insertSubview(subview1_name, aboveSubview: subview2_name)
/// You can use any of your view, instead of self.view

Related

UIBlurEffect not blurring entire image in UITableViewCell

I have the following code to blur out an image.
let blurEffect = UIBlurEffect(style: .light)
let blurredEffectView = UIVisualEffectView(effect: blurEffect)
blurredEffectView.frame = imageBlur.bounds
//blurredEffectView.alpha = 0.8
imageBlur.addSubview(blurredEffectView)
imageBlur.sd_setImage(with: URL(string: item._galleryURL), placeholderImage: UIImage(named: ""))
However, when I run the code, I am seeing this for the first two elements in the UITableView.
When I scroll down and then back up again, they will fix...
What can be causing this bug?
When you create the blur view in tableView cell you the view not now the exact size. So in the first create of screen it looks not okay but when you scroll down and up it recycles and know it size it becomes okay.
So you can solve it by giving size in layoutsubviews() function like
override func layoutSubviews() {
super.layoutSubviews()
blurredEffectView.frame = imageBlur.bounds
}

Swift 5 custom navigation bar cover title and buttons

After seeking a lot and trying many solutions, nope fixed my problem.
In my app I customized the UINavigationController in order to have blur effect:
import UIKit
class CustomNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
visualEffectView.frame = (self.navigationBar.bounds.insetBy(dx: 0, dy: -40).offsetBy(dx: 0, dy: -40))
self.navigationBar.isTranslucent = true
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.addSubview(visualEffectView)
self.navigationBar.sendSubviewToBack(visualEffectView)
}
}
Then in Main.storyboard I selected the customized class for the navigation controller item.
The blur effect works properly, the status icons are correctly visible, but not the standard navigation bar items: left button, title and right button.
For a moment they appears but soon after the customized navigation bar covers them.
I'm using Xcode 12.4 and I'm running the app on iPhone Xr.
How can I show the navigation bar elements again?
Thanks a lot in advance.
Translucent navigation bars in iOS already blur the content behind the bar, so you shouldn't need to add a UIVisualEffectView nor set a backgroundImage.
If you modify your code to just:
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationBar.isTranslucent = true
}
does this not achieve the visual effect you're looking for?
If not, please try the following adjustment to your methodology:
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationBar.isTranslucent = true
// create a UIImageView
let backgroundImage: UIImageView = UIImageView()
backgroundImage.autoresizingMask = [.flexibleWidth, .flexibleHeight]
backgroundImage.image = UIImage()
// add a blur effect to the ImageView
let visualEffectView: UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
visualEffectView.frame = (self.navigationBar.bounds.insetBy(dx: 0, dy: -40).offsetBy(dx: 0, dy: -40))
backgroundImage.addSubview (visualEffectView)
// and set that as your backgroundImage on the navigationBar
self.navigationBar.setBackgroundImage(backgroundImage.image, for: .default)
}
this adds the blur effect to the backgroundImage. This seems to work for me, but the visual effect is no different than just using my first suggestion, likely because backgroundImage.image == nil.
This is certainly an improved approach in that it doesn't add unexpected subviews into the UINavigationBar view hierarchy, and I observed both methods did not affect the visibility of the bar controls.

Blurred UIImageView Sizing Problems

A UIViewController I'm presenting has a UIImageView, namely backgroundImageView, to be the VC's background and set to fill the whole screen.
I want the UIImageView to be presented with a dark blur effect provided by iOS but the following sizing issue temporarily occurs(on device but not on the simulator) when I first present the view controller:
Inside viewDidLoad():
// `locationImage` is passed during the segue
backgroundImageView.image = locationImage
backgroundImageView.contentMode = .scaleAspectFill
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = backgroundImageView.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
backgroundImageView.addSubview(blurEffectView)
The above view controller's modalPresentationStyle is set to be as currentContext.
If I temporarily remove the blur effect, I see that the background image I gave the view controller got properly set. However once the blur effect is applied, sizing issues occur momentarily.
What exactly is causing this?
Try to set the frame of blurEffectView inside viewWillLayoutSubviews() or in viewDidLayoutSuviews()
here you can find more information about viewcontroller's lifecycle

iOS 10 - Blurred Background doesn't work anymore

Does anyone has problems with the UIBlurEffect on iOS10 ?
For some Reason the background of my button etc just gets a bit transparent and doesn't blurr anymore....
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.ExtraLight)
blurBackgroundView = UIVisualEffectView(effect: blurEffect)
blurBackgroundView.frame = frame
button = UIButton(frame: frame)
blurBackgroundView.layer.masksToBounds = true
backgroundColor = UIColor.clearColor()
addSubview(blurBackgroundView)
addSubview(button)
that's how the code looks....
If I change UIBlurEffectStyle.ExtraLight to UIBlurEffectStyle.Prominent based on the new documentation the Button is just clear... so no color at all!
Add whatever you want not to be blurred to your blurBackgroundView. So instead of:
addSubview(blurBackgroundView)
addSubview(button)
You'll have to:
blurBackgroundView.addSubview(button)
addSubview(blurBackgroundView)
Now every item in the current view, below your blurBackgroundView will get blurred, while your button will stay as it is.

UIVisualEffectView in a UITableViewCell breaks when deleting a cell

I have created a UITableViewController and each cell has a blur effect applied to them using UIVisualEffectView. I also have a blurred background that is created in the UITabBarViewController that the table view is linked to. The extra blur effect applied to each cell adds a nice touch to the UI I am designing, and it works for the most part.
The Issue
Everything works fine until I delete an item from the table. Doing so causes the whole table view to appear damaged. Everything returns to normal after the delete animation has been completed.
I have tried applying the UIVisualEffectView via code and the storyboard, and the problem is consistent either way. When using code, I apply the effect here like this:
// 'cell' is the cell being configured in tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
visualEffectView.frame = cell.bounds
cell.insertSubview(visualEffectView, atIndex: 0)
Note: After doing more testing, I have narrowed down the problem. When setting a cell to a clear color via the storyboard or in code using cell.backgroundColor = UIColor.clearColor(), the damaged animation appears. In fact, it does this for any color that has some, or complete transparency. When there is no transparency, the issue stops, but then the background from the UITabBarController is no longer visible.
My Question
How can I fix the damaged animation while keeping a similar/same look?
And if you want to see how I added the blur to the UITableViewController, here it is:
class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate {
var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
imageView = UIImageView(image: UIImage(named: "Sunset"))
imageView.frame = self.view.bounds
imageView.contentMode = .ScaleAspectFill
view.insertSubview(imageView, atIndex: 0)
let blurEffect = UIBlurEffect(style: .Light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = imageView.bounds
view.insertSubview(blurEffectView, aboveSubview: imageView)
}
//...
And here is what damaged animation looks like on the simulator (same thing happens on a physical device too):

Resources