I'm trying to layout a tableview in a UIViewController with a transparent navigationBar. I already accomplished this, using this code on my custom UINavigationController:
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
navigationBar.isTranslucent = true
On my storyboard I set my tableView with its edges pinned to the safe area, except for the top one, who is pinned to the top of the super view.
Problem is that my tableView is not starting at the top of the screen but as if the navigation bar is still opaque. I check the tableView insets and all are zero. What I'm doing wrong here?
Thanks
You can try to disable the scroll view insets adjustment.
contentInsetAdjustmentBehavior is available from iOS11 so you can check the availability like in this code:
if (#available(iOS 11.0, *))
{
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
else
{
self.automaticallyAdjustsScrollViewInsets = NO;
}
Related
I make this screen with collection view with using supplementary HeaderView. I want to make this HeaderView to the status bar. I make clear color to status bar but it is not working. Please help me with it.
I think you need to make the next, delete this view and put this image in the back of the navigation bar, the next is putting navigation bar transparent and the tint color in white like this :
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = .clear
self.navigationController?.navigationBar.tintColor = UIColor.white
You could try to get the contents of the collection view started earlier.
collectionView.contentInset.top = -14
So, first of all in your info.plst tap "+" button and this line.
Than in your UIViewController add this method.
override var prefersStatusBarHidden: Bool {
return true
}
Status bar will be hidden only in this viewController.
I have a transparent UINavigationBar. I also set hidesBarsOnSwipe to true. I want my navigationBar be on top of the content and hides when scrolling. Basically i want to achieve this effect (Navigation Bar on top of the content and also hiddes when scroll):
For now i just have this code and works everything, but i'm not able to put the content of the view behind the navigationBar:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.backgroundColor = .clear
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.hidesBarsOnSwipe = true
Here is a sample project , as you see the tableView is at the bottom of the navigationBar and just goes to the top when it hides the navigationBar.
On your view controller in Interface Builder disable Adjust Scroll View Insets. You can probably do it from code if you want as well.
I have added one custom UINavigationBar in my UIViewController with constraints top, trailing, leading = 0 and height = 64. In IOS 11, it showing one separator line between the UINavigationBar.
Try with below code
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
Try to set to navigation bar delegate and implement it in view controller
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .top
}
I hid the navigation bar's shadow using the following trick:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
I also have the following set:
self.extendedLayoutIncludesOpaqueBars = true
self.automaticallyAdjustsScrollViewInsets = true
self.tabBarController?.tabBar.isHidden = true
Everything looks fine on my page, except that when I scroll up my tableView it goes under the navigation bar as expected, but above the status bar:
How do I make sure that the tableView scrolls under both the navigation bar and status bar?
This will place the UITableView below the status bar.
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;
You hid the default background of the navigation bar so this is to be expected. It means you are creating the green background in the navigation bar by yourself. You have to manually extend it to cover both status bar and navigation bar which is what the default background would do.
Or use a green image instead of a transparent one.
I had same problem and the only thing which helped was to set a top anchor of my table view to safeArea topAnchor
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
You can try table view as under the UIEdgeInsetMake and also its scroll view
tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
tableView.scrollIndicatorInsets = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
Issue: Searchbar shifts down when presented. Before presented, the bar is right below the navigation bar.
More Info:
The navigation bar is just a UINavigationBar that's manually added to a UIViewController through storyboard
Most importantly, the UIViewController uses UIPresentationController to create that effect where the presented VC is slightly offset from the top and the presenting VC is scaled down and "behind" the presented VC. The shift does not happen if I don't use a UIPresentationController.
searchController.hidesNavigationBarDuringPresentation = NO
Any Ideas?
self.definesPresentationContext = YES;
or
self.edgesForExtendedLayout = UIRectEdgeNone;
On a side not it is probably better to add the searchbar to the header of the tableview.
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
} else {
tableView.tableHeaderView = searchController.searchBar
}
if you set searchBar to tableHeaderView under iOS 11.0 will cause this question, so you can do it like this. everything will be ok!