2015-06-11 201 views
0

所以我試圖克隆Apple天氣應用程序。我ViewHierarchy看起來是這樣的:將動態視圖添加到UIScrollView

ViewControllerA包含UIScrollView又包含一個UIView(UIView1)UIView包含子elements.There也是UIScrollView下方的按鈕來添加更多的UIView裏面UIScrollView。 This UIViewController設計在IB使用AutoLayout

當我點擊這個按鈕理想我想克隆UIView1並把它添加到UIScrollView,到currentViewUIScrollView內的右手邊結束。這是一個水平滾動功能。這是我卡住的地方。

我試過的是以下幾種: 在xib中創建一個UIView1的副本並加載。 以編程方式創建UIView並加載它。

在這兩種情況下,我都面臨着自動佈局約束問題。當我加載第二個視圖時,它會覆蓋現有視圖的頂部。 我可以對克隆的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) 

    } 

} 
+1

看看buildView方法,cityView目前沒有添加到scrollView中,但是您已經使用cityView和scrollView創建了約束條件,這是無效的。視圖必須在視圖層次結構中,然後才能添加約束。 – Sandeep

+0

@ k6sandeep老兄謝謝 - 添加視圖後添加約束。此外,我將約束添加到cityView,將其更改爲ScrollView,現在它正在工作 - 儘管存在衝突的約束。應用程序至少不會崩潰:) –

回答

0

代表@ k6sandeep發佈答案。我沒有加載視圖內的滾動視圖,但增加了約束。所以通過在加載內部視圖後添加約束來修復這個問題。