NSLayout Ограничения не выполняются
Поэтому я пытаюсь программно добавить ограничения на мой взгляд, используя следующий код. Я пытаюсь добавить верхний пробел из 32 и ведущий пробел из 16 в представление, которое программно добавляется в один из моих контроллеров представления, но у меня, похоже, возникают некоторые проблемы.
Ниже приведен пример того, как я возвращаю кнопку на мой взгляд, чтобы она могла быть добавлена программно.
// Creating the button
func createDismissButton(vwParentView: OnboardingViewController) -> UIButton {
let dismissButton = UIButton()
dismissButton.setImage(UIImage(named: "Close"), forState: .Normal)
dismissButton.frame = CGRectMake(16, 32, 34, 34)
dismissButton.addTarget(self, action: "dismiss:", forControlEvents: .TouchUpInside)
// AUTO LAYOUT
// WIDTH & HEIGHT
let dismissWidthButtonConstraint = NSLayoutConstraint (item: dismissButton,
attribute: NSLayoutAttribute.Width,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 34)
let dismissHeightButtonConstraint = NSLayoutConstraint (item: dismissButton,
attribute: NSLayoutAttribute.Width,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 34)
// SPACING
let dismissButtonTopConstraint = NSLayoutConstraint(item: dismissButton,
attribute: .Top,
relatedBy: .Equal,
toItem: vwParentView.view,
attribute: .Top,
multiplier: 1.0,
constant: 32)
let dismissButtonLeftConstraint = NSLayoutConstraint(item: dismissButton,
attribute: .Leading,
relatedBy: .Equal,
toItem: vwParentView.view,
attribute: .Leading,
multiplier: 1.0,
constant: 16)
dismissButton.addConstraint(dismissWidthButtonConstraint)
dismissButton.addConstraint(dismissHeightButtonConstraint)
dismissButton.addConstraint(dismissButtonTopConstraint)
dismissButton.addConstraint(dismissButtonLeftConstraint)
return dismissButton
}
Но, похоже, что на промежутке я добавляю vwParentView.view
поскольку в журнале возникла ошибка о том, что свойство элемента должно быть представлением. Но теперь, когда я запускаю код с этими свойствами, я получаю следующую ошибку.
"NSInternalInconsistencyException", причина: "Невозможно настроить макет с иерархией представления, неподготовленной к ограничению".
Я пытаюсь добавить эту кнопку в представление, которое также было создано программно, как показано ниже.
override func viewWillAppear(animated: Bool) {
// Add the view below to the current view controller
self.view.addSubview(generatePurchasePaging().view)
}
func generatePurchasePaging() -> OnboardingViewController {
let welcomePage = OnboardingContentViewController(title: "PAY WHAT YOU WANT", body: "I made my app so you could have the best experience reading tech related news. That’s why I want you to value it based on your satisfaction.", image: UIImage(named: "Purchase-Pig"), buttonText: "") { () -> Void in
}
let firstPurchasePage = OnboardingContentViewController(title: "MINT", body: "The app is great but there’s still a few places in room of improvement. If this is your feeling this is for you.", image: UIImage(named: "Purchase-Mint"), buttonText: "69p") { () -> Void in
}
let secondPurchasePage = OnboardingContentViewController(title: "SWEET", body: "IThis is the suggested price where you value the time I spent on development and design. Feel free to pay more or less.", image: UIImage(named: "Purchase-Lolly"), buttonText: "£1.49") { () -> Void in
}
let thirdPurchasePage = OnboardingContentViewController(title: "GOLD", body: "Hello is it me your looking for, if this popped into your mind using the app then this is the price for you.", image: UIImage(named: "Purchase-Coin"), buttonText: "£2.99") { () -> Void in
}
let purchaseVC = OnboardingViewController(backgroundImage: nil, contents: [welcomePage, firstPurchasePage, secondPurchasePage, thirdPurchasePage])
purchaseVC.shouldMaskBackground = false
purchaseVC.view.addSubview(createDismissButton(purchaseVC))
return purchaseVC
}
1 ответ
Несколько мыслей:
Когда вы программно создаете представление,
translatesAutoresizingMaskIntoConstraints
по умолчаниюtrue
, Выключи это.Вы устанавливаете ограничения для другого представления (его суперпредставления?) Перед добавлением его в иерархию представлений. Поэтому убедитесь, что (а) вы сначала выполняете
addSubiew
и (b) это ограничение должно быть добавлено к ближайшему общему родителю (обычно суперпредставлению), а не к самой кнопке..NotAnAttribute
ограничения могут быть добавлены к кнопке, но остальные должны быть добавлены к ближайшему общему родителю.Вы устанавливаете как ограничения, так и
frame
, Если вы делаете первое, второе не нужно.
Если после устранения вышеуказанного все еще не работает, поделитесь полным текстом ошибки, а не только однострочным сообщением.