Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带自动布局的编程UIScrollview_Ios_Swift_Uiscrollview_Autolayout - Fatal编程技术网

Ios 带自动布局的编程UIScrollview

Ios 带自动布局的编程UIScrollview,ios,swift,uiscrollview,autolayout,Ios,Swift,Uiscrollview,Autolayout,在阅读了苹果网站上的技术说明和matt neuburg的书《用Autolayout固定的UIScrollview编程iOS 11》之后,我还没有完全理解它是如何工作的 基本上我想要的是一个滚动视图,它将有一个子视图子视图,而这个子视图将有一个文本视图 下面我附上了我试图通过编程实现的模型,没有笔尖,没有故事板 至于代码,这是我通常想到的: 代码 let Scroller: UIScrollView = { let scroll = UIScrollView() scroll.t

在阅读了苹果网站上的技术说明和matt neuburg的书《用Autolayout固定的UIScrollview编程iOS 11》之后,我还没有完全理解它是如何工作的

基本上我想要的是一个滚动视图,它将有一个子视图子视图,而这个子视图将有一个文本视图

下面我附上了我试图通过编程实现的模型,没有笔尖,没有故事板

至于代码,这是我通常想到的:

代码

let Scroller: UIScrollView = {
    let scroll = UIScrollView()
    scroll.translatesAutoresizingMaskIntoConstraints = false
    scroll.backgroundColor = UIColor.alizarinColor()
    return scroll
}()

// Content view

let ContentView : UIView = {

    let content = UIView()
    content.translatesAutoresizingMaskIntoConstraints = false
    content.backgroundColor = UIColor.blue
    return content
}()

override func viewDidLoad() {

    super.viewDidLoad()

    self.view.addSubview(Scroller)

    // Auto layout
    Scroller.leftAnchor.constraint(equalTo: view.leftAnchor, constant:0).isActive = true
    Scroller.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
    Scroller.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
    Scroller.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true

    Scroller.addSubview(ContentView)
    // Undefined Content view 
}
请注意:对于内容视图,我通常会定义约束来锚定滚动视图内的边缘,但在这种情况下,我不希望使用Autolayout和这样一个事实,即当键盘
成为第一响应者时,我希望它垂直向上滚动。我提出的另一种方法是创建一个比Scrollview更大的
UIView
,以允许子视图成为以scroll视图为父视图的更大视图的子视图

我的问题:从现在开始,我如何才能做到这一点?有什么建议吗? 我一直在考虑这样的事情:(ContentView是一个更大的视图,它允许滚动,子视图是层次结构中的第三个子视图)


创建scrollView时,apple建议在其中放置contentView,并为该contentView提供viewController视图的宽度,并将其顶部、底部、前导和尾随约束固定到scrollView,然后根据需要从上到下放置项目,并将最底部的项目固定到scollview的contentView的底部,以便scrollview可以呈现其高度,此底部约束可以是您喜欢的,根据它scrollview将继续滚动,直到完成为止

  • 您不需要创建人造内容视图,您可以直接将子视图添加到滚动视图(我更喜欢)。苹果不建议创建一个,他们只是建议你可以

  • 滚动视图的子视图不应依赖滚动视图来确定其大小,而应仅确定其位置

  • 约束必须定义最左侧、最右侧、最顶部和最底部的边,以便自动布局为您创建内容视图

  • 创建滚动视图时,可以为其框架指定控制器视图的边界:

    scrollView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(scrollView)
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    scrollView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
    
    然后,必须通过将内容视图的子视图锚定到滚动视图的边缘来设置内容视图的边界。要实现仅垂直滚动,您的最顶部视图必须定位到滚动视图的顶部,并且定位到前缘和后缘的子视图不得超过滚动视图的宽度

    topMostView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(topMostView)
    topMostView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    topMostView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    topMostView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    topMostView.heightAnchor.constraint(equalToConstant: 1000).isActive = true
    
    请注意,
    topMostView
    不依赖滚动视图来确定其大小,只依赖其位置。滚动视图中的内容现在的高度为
    1000
    ,但它不会滚动,因为没有任何内容固定在滚动视图的底部。因此,请在最底层视图中执行此操作

    bottomMostView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(bottomMostView)
    bottomMostView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    bottomMostView.topAnchor.constraint(equalTo: topMostView.bottomAnchor).isActive = true
    bottomMostView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    bottomMostView.heightAnchor.constraint(equalToConstant: 1000).isActive = true
    
    bottomMostView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    
    最后一个锚点可能看起来很奇怪,因为您正在将
    1000
    点高的视图锚定到您刚刚锚定到视图底部的锚点,该锚点的高度肯定小于
    1000
    点高。但这正是苹果希望你做到的。这样,您就不需要创建内容视图,自动布局可以为您创建内容视图


    定义“边缘约束”(最左侧、最右侧、最顶部、最底部)的原则超出了滚动视图的范围。使用“自动布局”创建自定义
    UITableViewCell
    时,定义四个边约束(即最顶部的子视图定位到单元格顶部的位置
    topMostView.topAnchor.constraint(equalTo:self.topAnchor).isActive=true
    ,单元格底部最底部的子视图
    bottomMostView.topAnchor.constraint(equalTo:self.bottomAnchor).isActive=true
    等)是创建自调整大小单元格的方式。实际上,这是创建任何自调整大小视图的方式。

    您的scrollview的子视图永远不会比scrollview大。(更像是更少或相等)。比如说你有一个
    UIView
    (高度=500),这个高度非常适合(iphone6=)。您不需要单独使用视图,而是添加一个
    滚动视图
    (高度=500或屏幕大小+内容高度的额外填充,如果需要),并将所需视图包装为其子视图,这样您的问题就解决了。非常感谢@iabuseservers。这太神奇了。解释效果很好,我测试了将子视图放置到这两个视图中。那么在这些视图中约束对象是安全的吗?我约束它们的方式是使用堆栈视图。让我知道这样做是否安全,因此您应该明确给出scrollview约束的子视图。你可以在滚动视图中放置一个堆栈视图;只需确保将堆栈视图正确地锚定到滚动视图,以扩展其内容区域。回答不错,谢谢您的帮助。FWIW,我不确定你绝对必须从L->R和T->B系上链式约束装置。如果你在寻找这个答案的不同措辞。然后你可以看看这个。惊人的解释!但是如果我想在滚动视图的右侧锚定一个视图呢?有办法做到这一点吗?