试图用Swift以编程方式显示UIScrollView而根本不显示

时间:2015-04-14 00:18:52

标签: ios swift uiview uiscrollview

目前我正在以编程方式构建预览视图,因为UI上需要一些动态变化。我已经构建了下面代码中引用的UI元素。但是,正如我在代码中展示的那样,我已经尝试了很多东西而且我无法显示UIScrollView,当然,甚至连我放入的视图都没有。我将UIScrollView上的颜色变为红色以检测它,并在UIView出现时将颜色变为橙色:

// SPEC DETAILS SECTION
    nameLabel = UILabel();
    previewButton = UIButton();
    let aboutLabelCaption = UILabel();
    aboutLabel = UILabel();
    specsScrollView = UIScrollView();
    let specsView = UIView(frame: CGRectMake(0, 0, 400, 400));

    // ... Another code to setup the previews views ...

    view.addSubview(specsScrollView);

    var specsScrollViewConstY = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal,
        toItem: coverImage, attribute: NSLayoutAttribute.Bottom, multiplier: 1,
        constant: 10);
    var specsScrollViewConstX = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal,
        toItem: aboutLabel, attribute: NSLayoutAttribute.Trailing, multiplier: 1,
        constant: 10);
    var specsScrollViewConstWidth = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual,
        toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1,
        constant: 400);
    var specsScrollViewConstHeight = NSLayoutConstraint(item: specsScrollView,
            attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual,
            toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1,
            constant: 400);

    view.addConstraint(specsScrollViewConstY);
    view.addConstraint(specsScrollViewConstX);
    view.addConstraint(specsScrollViewConstWidth);
    view.addConstraint(specsScrollViewConstHeight);

    let topLevelArray: NSArray = NSBundle.mainBundle().loadNibNamed("PreviewDetails", owner: self, options: nil);
    let viewFromXib = topLevelArray.objectAtIndex(0) as UIView;

    specsScrollView.backgroundColor = UIColor.redColor();
    specsView.backgroundColor = UIColor.orangeColor();
    specsScrollView.addSubview(specsView);
    //specsScrollView.addSubview(viewFromXib);

    specsScrollView.setTranslatesAutoresizingMaskIntoConstraints(false);
    //specsView.setTranslatesAutoresizingMaskIntoConstraints(false);
    specsScrollView.contentSize = CGSizeMake(400, 400);

    var specsViewConstTop = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal,
        toItem: specsScrollView, attribute: NSLayoutAttribute.Top, multiplier: 1,
        constant: 0);
    var specsViewConstLeading = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal,
        toItem: specsScrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1,
        constant: 0);
    var specsViewConstTrailing = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal,
        toItem: specsScrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1,
        constant: 0);
    var specsViewConstBottom = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal,
        toItem: specsScrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1,
        constant: 0);
    var specsViewConstHeight = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal,
        toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1,
        constant: 400);
    var specsViewConstWidth = NSLayoutConstraint(item: specsView,
        attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal,
        toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1,
        constant: 400);

    specsScrollView.addConstraint(specsViewConstTop);
    specsScrollView.addConstraint(specsViewConstLeading);
    specsScrollView.addConstraint(specsViewConstTrailing);
    specsScrollView.addConstraint(specsViewConstBottom);
    specsScrollView.addConstraint(specsViewConstHeight);
    specsScrollView.addConstraint(specsViewConstWidth);

    let aLabel = UILabel();
    aLabel.text = "Hola mundo";
    specsView.addSubview(aLabel);
    // -- SPEC DETAILS SECTION

我不确定我做得怎么样。我希望你能帮助我。我想明确表示它不会抛出任何异常或错误。只是我正在以编程方式构建的视图没有出现。

1 个答案:

答案 0 :(得分:2)

如果您可以发布有关所需结果的信息(可能是截图),将会很有帮助。

无论如何,我已经可以看到你的实现中缺少一些东西了。

首先,您需要在以编程方式创建的所有视图上调用setTranslatesAutoresizingMaskIntoConstraints(false),而不仅仅是在scrollView上。

其次,当您为scrollView添加水平约束时,您将它连接到aboutLabel,您不会为其添加任何约束。这是我所指的限制因素:

var specsScrollViewConstX = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal,
        toItem: aboutLabel, attribute: NSLayoutAttribute.Trailing, multiplier: 1,
        constant: 10);

对于调试,您可以在添加约束后调用view.layoutIfNeeded(),在调用后添加断点,然后打印出所有视图的帧,以便查看哪一个是错误的。

让我知道它是怎么回事,或者你是否需要更多的帮助。


<强>更新

好的,我在运行代码后发现了问题。对于所有视图来说,添加宽度和高度约束的方式似乎都是错误的。

我试过这个(我只会发布scrollView的代码,但是你需要更改你的所有视图):

// SPEC DETAILS SECTION
    view.addSubview(specsScrollView);

    var specsScrollViewConstY = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal,
        toItem: coverImage, attribute: NSLayoutAttribute.Bottom, multiplier: 1,
        constant: 10);
    var specsScrollViewConstX = NSLayoutConstraint(item: specsScrollView,
        attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal,
        toItem: aboutLabel, attribute: NSLayoutAttribute.Trailing, multiplier: 1,
        constant: 10);
    var specsScrollViewConstWidth = NSLayoutConstraint.constraintsWithVisualFormat("H:[scrollview(400)]", options: nil, metrics: nil, views: ["scrollview":specsScrollView]);
    var specsScrollViewConstHeight = NSLayoutConstraint.constraintsWithVisualFormat("V:[scrollview(400)]", options: nil, metrics: nil, views: ["scrollview":specsScrollView]);

    view.addConstraint(specsScrollViewConstY);
    view.addConstraint(specsScrollViewConstX);
    view.addConstraints(specsScrollViewConstWidth);
    view.addConstraints(specsScrollViewConstHeight);

这将使scrollView显示出来。一旦你进行了这些更改,你的所有视图都会有正确的框架,但我不确定你想要的结果,但你可以改变值以适应。

更改所有约束后,您可以删除为视图设置框架的所有语句,不再需要它。

此外,在设置所有约束后添加view.layoutIfNeeded(),以便您看到更改。

还有一件事,因为当我运行代码时,你的约束会崩溃,你需要为按钮previewButton.setTranslatesAutoresizingMaskIntoConstraints(false)

添加它