2017-02-12 3 views
1

Ссылаясь на этот вопрос Making a custom UIView subview that fills its superview при попытке добавить ограничения программно.Не удается найти просмотр при добавлении ограничений программно?

Я использую следующий код, чтобы добавить два ограничения в программировании; однако я получаю сообщение об ошибке: «Невозможно разобрать формат ограничения», потому что связанное представление не имеет супервизора.

private func setupDownView(view: UIView) { 
    let downView = try? DownView(frame: view.bounds, markdownString: "") 
    downView!.translatesAutoresizingMaskIntoConstraints = false 
    let viewsDict = ["view": downView!] 
    downView!.addConstraint(NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)[0]) 
    downView!.addConstraint(NSLayoutConstraint.constraints(
     withVisualFormat: "H:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)[0]) 
    view.addSubview(downView!); 
} 

enter image description here

станет ли view авто в SuperView, когда он был добавлен в его подвид?

Я попытался добавить представление перед установкой ограничений на addSubview до addConstraint, и я получаю сообщение об ошибке «Иерархия представлений не подготовлена ​​к ограничению».

enter image description here

setupDownView вызываются в следующих два местах,

@IBOutlet weak var cardTags: UIView! {didSet { setupDownView(view: cardTags)}} 
@IBOutlet weak var cardContent: UIView! { 
    didSet { 
     setupDownView(view: cardContent) 
     let tap = UILongPressGestureRecognizer(
      target: self, 
      action: #selector(QuizViewController.tapDownHandler) 
     ) 
     tap.minimumPressDuration = 0 
     cardContent.addGestureRecognizer(tap) 
    } 
} 
+0

Можете ли вы дать ответ ниже, как ссылку для тех, у кого есть аналогичная проблема? –

+0

Я добавил свой комментарий в качестве ответа. – vacawama

ответ

3

ограничение должно быть добавлено после того, как мнение в иерархии. Таким образом, addSubview звонок должен быть доaddConstraint звонки.

обеспечить также, что addConstraint называется на это SuperView, не downView, и что все ограничения, возвращаемые constraintsWithVisualFormat: добавляются, а не только первый.

private func setupDownView(view: UIView) { 
    let downView = try? DownView(frame: view.bounds, markdownString: "") 
    downView!.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(downView!); 

    let viewsDict = ["view": downView!] 
    view.addConstraints(NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)) 
    view.addConstraints(NSLayoutConstraint.constraints(
     withVisualFormat: "H:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)) 

    view.layoutIfNeeded() 
} 
+0

Спасибо. Я попробовал ваш код, но мой 'downView' исчез. :( –

+0

Какая ошибка? – Legoless

+0

Никакой ошибки вообще, она просто больше не отображается на виду. –

1

Начиная с iOS 8, вам не нужно указывать, к какому виду добавить ограничения, просто активируйте их. Для отдельных ограничений просто установите .isActive на true. Чтобы активировать весь массив ограничений, используйте метод удобства NSLayoutConstraint.activate().

Для вашего кода, а не делать:

view.addConstraints(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-0-[view]-0-|", 
    options: [], 
    metrics: nil, 
    views: viewsDict)) 

Вы хотите использовать:

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-0-[view]-0-|", 
    options: [], 
    metrics: nil, 
    views: viewsDict)) 

Это работает, потому что ограничения уже знают, какой вид или вид они относятся, и какао или Cocoa Touch может определить подходящий вид в иерархии представления, чтобы добавить ограничения, которые могут быть сложными в зависимости от того, как связаны представления (например, братья и сестры, родительский/дочерний, другой) ,

Здесь применяются те же оговорки. Вы должны убедиться, что представления находятся в иерархии представлений до, активируя ограничения, или вы получите ошибки. Итак, сделайте .addSubview перед активацией ограничений.

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