Swift iOS以编程方式在导航栏下方设置滚动视图约束

Swift iOS以编程方式在导航栏下方设置滚动视图约束,ios,swift,uiscrollview,Ios,Swift,Uiscrollview,我的UIViewController嵌入在导航控制器中。我以编程方式添加了导航按钮,现在尝试在这个导航栏下面添加一个滚动视图。我遇到的问题是,这是填写完整的框架大小,并在导航栏下 如何以编程方式设置此scrollview的约束 var scrollView: UIScrollView! var containerView = UIView() override func viewDidLoad() { super.viewDidLoad() self.navigationIte

我的UIViewController嵌入在导航控制器中。我以编程方式添加了导航按钮,现在尝试在这个导航栏下面添加一个滚动视图。我遇到的问题是,这是填写完整的框架大小,并在导航栏下

如何以编程方式设置此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)
}

在Objective-C中,我通常将“edgesForExtendedLayout”属性设置为UIRectEdgeNone:

尽管如此,我还是建议将约束绑定到topLayoutGuide


希望这对您有用。

虽然Clafou的回答肯定是正确的,但如果您不需要透明度,并且希望从导航栏开始,真正正确的方法是更改ViewController的行为,使其适合内容。为此,您有两种选择:

1) 假设您有故事板,请转到ViewController属性检查器并禁用“顶栏下”

2) 假设您通过代码完成了所有操作,您将需要查找以下属性-
edgesForExtendedLayout
,以及
extendedlayoutincludesopaquebar
。这已经有了,所以我不在这里讨论了


希望有帮助

在使用
auto layout
时,只需确保使用
top layout Guide
而不是滚动视图的
superview
UIScrollView
提供
顶部约束即可。

我在iOS11上实现此功能的唯一方法是这样的

if (@available(iOS 11.0, *)) {
    scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    // Fallback on earlier versions
}
斯威夫特5

let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(imageView)
scrollView.contentInsetAdjustmentBehavior = .never

NSLayoutConstraint.activate([
    scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])

这正是我所需要的,我也设法找到了如何通过编程实现这一点。我不相信就这么多。。。我遇到了一个奇怪的问题,我有一个滚动视图卡在顶部栏下,但在显示并关闭键盘后,它从下面弹出。可能还有更深层次的问题,但至少这次修复成功了。谢谢!你能解释一下区别吗?或者我在哪里可以看到关于这个问题的可视化文档?请注意-这与UIViewController的自动调整滚动视图插图不同。回答得好,非常感谢。这将使滚动视图的内容项位于导航栏下方
if (@available(iOS 11.0, *)) {
    scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    // Fallback on earlier versions
}
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(imageView)
scrollView.contentInsetAdjustmentBehavior = .never

NSLayoutConstraint.activate([
    scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])