Swift iOS Set scrollView constraint below navigation bar programmatically
In Swift 5
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(imageView)
scrollView.contentInsetAdjustmentBehavior = .never
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
While using auto-layout
, just make sure that you give the top-constraint
of UIScrollView
with Top Layout Guide
, not with superview
of scroll view.
The only way I managed to get this working on iOS11 was like this
if (@available(iOS 11.0, *)) {
scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
}
While Clafou's answer is certainly correct, if you don't need transparency and want to start under navigation bar, the really proper way is to change behavior of the ViewController so it fits the content properly. To do that, you have two options:
1) Assuming you have Storyboard, go to ViewController Attributes Inspector and disable "Under top bars"
2) Assuming you are everything through code, you will want to look for following properties - edgesForExtendedLayout
, and extendedLayoutIncludesOpaqueBars
. There is great answer for that already on SO so I won't cover it here.
Hope it helps!