所以我試圖克隆Apple天氣應用程序。我ViewHierarchy
看起來是這樣的:將動態視圖添加到UIScrollView
ViewControllerA
包含UIScrollView
又包含一個UIView
(UIView1)
和UIView
包含子elements.There也是UIScrollView
下方的按鈕來添加更多的UIView
裏面UIScrollView
。 This UIViewController
設計在IB
使用AutoLayout
。
當我點擊這個按鈕理想我想克隆UIView1
並把它添加到UIScrollView
,到currentView
的UIScrollView
內的右手邊結束。這是一個水平滾動功能。這是我卡住的地方。
我試過的是以下幾種: 在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)
}
}
看看buildView方法,cityView目前沒有添加到scrollView中,但是您已經使用cityView和scrollView創建了約束條件,這是無效的。視圖必須在視圖層次結構中,然後才能添加約束。 – Sandeep
@ k6sandeep老兄謝謝 - 添加視圖後添加約束。此外,我將約束添加到cityView,將其更改爲ScrollView,現在它正在工作 - 儘管存在衝突的約束。應用程序至少不會崩潰:) –