2015-06-11 2 views
0

Так что я пытаюсь клонировать приложение 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) 

    } 

} 
+1

Посмотрите на метод buildView, cityView в это время не добавлен в scrollView, но вы уже создали ограничение с помощью cityView и scrollView, что недопустимо. Представление должно быть в иерархии представлений, прежде чем вы можете добавить ограничения. – Sandeep

+0

@ k6sandeep dude thanks - добавлено ограничение после добавления представления. Также я добавлял ограничение для cityView, менял его на ScrollView, и теперь он работает, хотя существуют конфликтующие ограничения. Приложение не рушится хотя бы :) –

ответ

0

Отправка ответа от имени @ k6sandeep. Я не загружал представление внутри scrollview, но добавлял к нему ограничения. Так исправлено то же самое, добавив ограничения после загрузки внутреннего просмотра.

Смежные вопросы