My UIViewController is embedded in a navigation controller. I programmatically add the navigation buttons and now trying to add a scrollView below this navigation bar. The problem I'm having is this is filling the full frame size and going under the navigation bar.
How do I programmatically set constraints of this scrollview?
var scrollView: UIScrollView!
var containerView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Filters"
// add some buttons on the navigation
self.scrollView = UIScrollView()
self.scrollView.backgroundColor = UIColor.grayColor()
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)
containerView = UIView()
scrollView.addSubview(containerView)
view.addSubview(scrollView)
let label = UILabel(frame: CGRectMake(0, 0, 100, 21))
label.text = "my label"
containerView.addSubview(label)
}
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!
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
}
In Swift 5
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(imageView)
scrollView.contentInsetAdjustmentBehavior = .never
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
当使用auto-layout
,只是确保你给top-constraint
的UIScrollView
与Top Layout Guide
,而不是与superview
滚动视图。
Use the contentInset
property of your UIScrollView
. For example if you want a gap of 44 points at the top:
self.scrollView.contentInset = UIEdgeInsets(top: 44, left: 0, bottom: 0, right: 0)
In Objective-C I usually set the 'edgesForExtendedLayout' Property to UIRectEdgeNone :
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
Nevertheless I would recommend to bind the Constraints to the topLayoutGuide
func addScrollViewConstraints() {
var scrollViewContraints = [NSLayoutConstraint]()
scrollViewContraints.append(NSLayoutConstraint(item: scrollView,
attribute: NSLayoutAttribute.Top,
relatedBy: NSLayoutRelation.Equal,
toItem: self.topLayoutGuide,
attribute:NSLayoutAttribute.Bottom,
multiplier: 1.0,
constant: 0.0))
scrollViewContraints.append(NSLayoutConstraint(item: scrollView,
attribute: NSLayoutAttribute.Bottom,
relatedBy: NSLayoutRelation.Equal,
toItem: self.bottomLayoutGuide,
attribute:NSLayoutAttribute.Top,
multiplier: 1.0,
constant: 0.0))
scrollViewContraints.append(NSLayoutConstraint(item: scrollView,
attribute: NSLayoutAttribute.Leading,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute:NSLayoutAttribute.Leading,
multiplier: 1.0,
constant: 0.0))
scrollViewContraints.append(NSLayoutConstraint(item: scrollView,
attribute: NSLayoutAttribute.Trailing,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute:NSLayoutAttribute.Trailing,
multiplier: 1.0,
constant: 0.0))
self.view.addConstraints(scrollViewContraints)
}
Hope this works for you.
for placing any view under the navigation bar use this code:
yourView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
Another solution from https://stackoverflow.com/a/75143442/851258
if let navBar = navigationController?.navigationBar {
scrollView.contentInset = UIEdgeInsets(top: -navBar.frame.size.height, left: 0.0, bottom: 0.0, right: 0.0)
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.