目前我正在以编程方式构建预览视图,因为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
我不确定我做得怎么样。我希望你能帮助我。我想明确表示它不会抛出任何异常或错误。只是我正在以编程方式构建的视图没有出现。
答案 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)