Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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 - Fatal编程技术网

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,现在它可以工作了——尽管存在冲突的约束。应用程序未崩溃(至少:)