Ios 向UIScrollView添加动态视图
所以我正在尝试克隆苹果天气应用程序。我的Ios 向UIScrollView添加动态视图,ios,swift,Ios,Swift,所以我正在尝试克隆苹果天气应用程序。我的ViewHierarchy如下所示: func buildView(startX:CGFloat, model:CityModel) -> UIView { var frame:CGRect = CGRectMake(0, 0, insideScrollView.bounds.width, insideScrollView.bounds.height) var cityView:UIView = UIView(frame: f
ViewHierarchy
如下所示:
func buildView(startX:CGFloat, model:CityModel) -> UIView {
var frame:CGRect = CGRectMake(0, 0, insideScrollView.bounds.width, insideScrollView.bounds.height)
var cityView:UIView = UIView(frame: frame)
var lFrame:CGRect = CGRectMake(0, 0, 100,50)
var cLabel:UILabel = UILabel(frame: lFrame)
cLabel.text = model.name
cLabel.sizeToFit()
cLabel.textAlignment = .Center
//cityView.addSubview(cLabel)
cityView.layer.backgroundColor = UIColor.blueColor().CGColor
cityView.setTranslatesAutoresizingMaskIntoConstraints(false)
var constX = NSLayoutConstraint(item: cityView, attribute: NSLayoutAttribute.LeftMargin, relatedBy: NSLayoutRelation.Equal, toItem: cityScrollView, attribute: NSLayoutAttribute.LeftMargin, multiplier: 1, constant: 0)
cityView.addConstraint(constX)
return cityView
}
ViewControllerA
包含一个UICrollView
,它依次包含一个UIView
(UIView1)
,UIView
包含子元素。UICrollView
下面还有一个按钮,用于在UICrollView
中添加更多UIView
。
此UIViewController
是在IB
中使用AutoLayout
设计的
当我点击此按钮时,我希望克隆UIView1
,并将其添加到UIScrollView
,添加到UIScrollView
中currentView
的右端。这是一个水平滚动功能。这就是我被困的地方
我尝试了以下几点:
在xib
中创建UIView1
的副本并加载该副本。
以编程方式创建ui视图
,并加载该视图
在这两种情况下,我都面临自动布局约束问题。加载第二个视图时,它将覆盖在现有视图的顶部。
我可以为克隆的UIView
硬编码帧大小,并使其正常工作,但很明显,这无法跨设备工作
所以我添加了一些约束条件,比如:
func buildView(startX:CGFloat, model:CityModel) -> UIView {
var frame:CGRect = CGRectMake(0, 0, insideScrollView.bounds.width, insideScrollView.bounds.height)
var cityView:UIView = UIView(frame: frame)
var lFrame:CGRect = CGRectMake(0, 0, 100,50)
var cLabel:UILabel = UILabel(frame: lFrame)
cLabel.text = model.name
cLabel.sizeToFit()
cLabel.textAlignment = .Center
//cityView.addSubview(cLabel)
cityView.layer.backgroundColor = UIColor.blueColor().CGColor
cityView.setTranslatesAutoresizingMaskIntoConstraints(false)
var constX = NSLayoutConstraint(item: cityView, attribute: NSLayoutAttribute.LeftMargin, relatedBy: NSLayoutRelation.Equal, toItem: cityScrollView, attribute: NSLayoutAttribute.LeftMargin, multiplier: 1, constant: 0)
cityView.addConstraint(constX)
return cityView
}
应用程序崩溃无法加载此约束,这表明视图层次结构不支持此约束,因为未加载所有视图
我将继续挖掘如何解决这个问题,但任何帮助都将不胜感激。这是我的viewDidLoad
方法。城市是一组包含视图数据的模型
override func viewDidLoad() {
super.viewDidLoad()
var startScroll = insideScrollView.bounds.width
if cities != nil {
for model in cities.cityModels {
if model.selected {
cityScrollView.addSubview(buildView(startScroll, model: model))
startScroll += cityScrollView.bounds.width
}
}
} else {
var cityModel: CityModel = CityModel(name: "default")
cityModel.selected = false
cities = SearchCityModels.sharedInstance
cities.cityModels.append(cityModel)
}
}
代表@k6sandeep发布答案。我没有在scrollview中加载视图,但正在为其添加约束。因此,通过在加载insideview后添加约束修复了相同的问题 查看buildView方法,此时未将cityView添加到scrollView,但您已经使用cityView和scrollView创建了约束,这是无效的。视图必须在视图层次结构中才能添加约束。@k6sandeep dude谢谢-在添加视图后添加了约束。此外,我还在cityView中添加了约束,将其更改为ScrollView,现在它可以工作了——尽管存在冲突的约束。应用程序未崩溃(至少:)