Ios ScrollView赢得';t滚动啊

Ios ScrollView赢得';t滚动啊,ios,swift,uiscrollview,autolayout,Ios,Swift,Uiscrollview,Autolayout,我一辈子都不知道自己做错了什么。我所要做的就是在滚动视图中放置一组文本字段,并使用自动布局从本质上确定contentSize。与我在那里观看和阅读的其他教程不同,我尝试以编程方式完成这项工作,而不是通过故事板或XIB 我在滚动视图中的每个视图(包括滚动视图本身)上调用了setTranslatesAutoResizengMacSkintoConstraints(false) 我已经设置了滚动视图的高度和宽度,以匹配其superview,甚至将滚动视图定位在其superview的中心(我了解到,有时

我一辈子都不知道自己做错了什么。我所要做的就是在滚动视图中放置一组文本字段,并使用自动布局从本质上确定contentSize。与我在那里观看和阅读的其他教程不同,我尝试以编程方式完成这项工作,而不是通过故事板或XIB

我在滚动视图中的每个视图(包括滚动视图本身)上调用了
setTranslatesAutoResizengMacSkintoConstraints(false)

我已经设置了滚动视图的
高度
宽度
,以匹配其superview,甚至将滚动视图定位在其superview的中心(我了解到,有时需要这样做才能使其正常工作)

我已将内容视图的边缘固定到其superview(滚动视图)的
顶部
前导
尾部
、和
底部
边缘

这是我的密码:

class ViewController: UIViewController {

    var scrollView = UIScrollView()
    var contentView = UIView()

    var textField1 = CustomTextField()
    var textField2 = CustomTextField()
    var textField3 = CustomTextField()
    var textField4 = CustomTextField()
    var textField5 = CustomTextField()
    var textField6 = CustomTextField()

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
        contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField1.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField2.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField3.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField4.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField5.setTranslatesAutoresizingMaskIntoConstraints(false)
        textField6.setTranslatesAutoresizingMaskIntoConstraints(false)

        view.addSubview(scrollView)
        scrollView.addSubview(contentView)
        contentView.addSubview(textField1)
        contentView.addSubview(textField2)
        contentView.addSubview(textField3)
        contentView.addSubview(textField4)
        contentView.addSubview(textField5)
        contentView.addSubview(textField6)

        contentView.backgroundColor = .redColor()

        setupConstraints()
    }

    func setupConstraints() {
        // Install height and width constraints on our scroll view
        let heightLC : NSLayoutConstraint = NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: 0)
        let widthLC : NSLayoutConstraint = NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0)
        self.view.addConstraints([heightLC,widthLC])

        // Install centering constraints on our scroll view
        let centerXLC : NSLayoutConstraint = NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0)
        let centerYLC : NSLayoutConstraint = NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1.0, constant: 0)
        self.view.addConstraints([centerXLC,centerYLC])

        // Set the content view so it resizes with the same proportions on screen rotations //
        let contentViewTopLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
        let contentViewLeadingLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0)
        let contentViewTrailingLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0)
        let contentViewBottomLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)
        let contentViewWidthLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0)
        let contentViewHeightLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: 0)
        scrollView.addConstraints([contentViewTopLC,contentViewLeadingLC,contentViewTrailingLC,contentViewBottomLC,contentViewWidthLC,contentViewHeightLC])

        // Setup the text field constraints
        let textField1Top : NSLayoutConstraint = NSLayoutConstraint(item: textField1, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
        let textField1Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField1, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField1Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField1, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        contentView.addConstraints([textField1Top, textField1Leading, textField1Trailing])

        let textField2Top : NSLayoutConstraint = NSLayoutConstraint(item: textField2, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: textField1, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 100)
        let textField2Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField2, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField2Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField2, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        contentView.addConstraints([textField2Top, textField2Leading, textField2Trailing])

        let textField3Top : NSLayoutConstraint = NSLayoutConstraint(item: textField3, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: textField2, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 100)
        let textField3Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField3, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField3Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField3, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        contentView.addConstraints([textField3Top, textField3Leading, textField3Trailing])

        let textField4Top : NSLayoutConstraint = NSLayoutConstraint(item: textField4, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: textField3, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 100)
        let textField4Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField4, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField4Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField4, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        contentView.addConstraints([textField4Top, textField4Leading, textField4Trailing])

        let textField5Top : NSLayoutConstraint = NSLayoutConstraint(item: textField5, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: textField4, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 100)
        let textField5Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField5, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField5Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField5, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        contentView.addConstraints([textField5Top, textField5Leading, textField5Trailing])

        let textField6Top : NSLayoutConstraint = NSLayoutConstraint(item: textField6, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: textField5, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 100)
        let textField6Leading : NSLayoutConstraint = NSLayoutConstraint(item: textField6, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 40)
        let textField6Trailing : NSLayoutConstraint = NSLayoutConstraint(item: textField6, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -40)
        let textField6Bottom : NSLayoutConstraint = NSLayoutConstraint(item: textField6, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: contentView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)
        contentView.addConstraints([textField6Top, textField6Leading, textField6Trailing, textField6Bottom])
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()


        // Dispose of any resources that can be recreated.
    }


}
这是我的
CustomTextField
类,我用于文本字段:

class CustomTextField: UITextField {
    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = .whiteColor()

        // set text field height to 55pts
        let heightLC : NSLayoutConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 55)
        addConstraint(heightLC)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
下面是该应用程序当前的外观 (注意第6个文本字段没有显示,我无法向下滚动到它):

任何帮助都将不胜感激:)


问题在于以下几行:

    let contentViewTopLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
    let contentViewLeadingLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0)
    let contentViewTrailingLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0)
    let contentViewBottomLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)
    let contentViewWidthLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0)
    let contentViewHeightLC : NSLayoutConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: 0)
    scrollView.addConstraints([contentViewTopLC,contentViewLeadingLC,contentViewTrailingLC,contentViewBottomLC,contentViewWidthLC,contentViewHeightLC])
您想要的是内容视图的大小根本不像滚动视图。这正是阻止滚动视图滚动的原因。您希望内容视图的四条边固定到滚动视图的四条边上


这样,内容视图的内容将在内容视图上向外推,调整其大小。因此,它将试图变得比滚动视图更大。但它不能,因为您还需要将滚动视图的侧面固定到其superview。因此,内容视图的大小将成为滚动视图的边界大小-其
contentSize
。当滚动视图的
contentSize
因此大于滚动视图时,它将是可滚动的。

您是否检查了滚动视图的contentSize属性?这是我想到的第一件事。我不确定它是如何与约束交互的,但它可能不会被隐式设置。你知道为什么没有隐式设置吗?我想不起来。你能用UITableView完成你想要达到的目标吗?否则,您必须计算大小并显式设置它。您说您找不到在代码中完成所有操作的示例。很明显,你没有读过我的书,因为这正是它所采取的方法。在我的书中的这个例子中,您应该专注于“案例3”-它通过自动布局以代码的形式展示了整个事情。谢谢你的回答,马特。那么,您的意思是删除contentViewWidthLC和contentViewHeightLC约束,并添加4个约束以将内容视图固定到滚动视图的边缘?我只是重申这一点,因为这是我尝试过的,但仍然没有运气。当我这样做时,屏幕上没有显示任何内容请看示例!它显示了使用内容视图时自动布局/无自动布局的所有四种组合。下载它。运行它。“你说的只是删除”我没说“删除”任何东西。所有这些限制都是错误的。内容视图必须固定到滚动视图的所有四个边缘。然后,它的内容必须在所有四个方面都受到完全约束,才能向外推以决定内容大小。也许我不理解约束,但我认为
contentViewTopLC
contentViewLeadingLC
contentViewTrailingLC
,和
contentViewBottomLC
将contentView固定到滚动视图的4个边缘。