Так что я пытаюсь клонировать приложение Apple по погоде. Моя ViewHierarchy
выглядит следующим образом:Добавление динамических представлений в UIScrollView
ViewControllerA
содержит UIScrollView
, который в свою очередь содержит UIView
(UIView1)
и UIView
содержит ребенка elements.There также кнопка ниже UIScrollView
, чтобы добавить больше UIView
внутри UIScrollView
. Этот UIViewController
разработан в IB
с использованием AutoLayout
.
При нажатии на эту кнопку в идеале я хочу, чтобы клонировать UIView1
и добавить его в UIScrollView
, к righthandside концу currentView
внутри UIScrollView
. Это функция горизонтальной прокрутки. Вот где я застрял.
То, что я пробовал, является следующим: Создайте копию UIView1
в xib
и загрузите это. Создайте 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 dude thanks - добавлено ограничение после добавления представления. Также я добавлял ограничение для cityView, менял его на ScrollView, и теперь он работает, хотя существуют конфликтующие ограничения. Приложение не рушится хотя бы :) –