Есть ли какой-либо программный способ временно отключить ограничение автоматической компоновки? Я не хочу, чтобы это ограничение рассматривалось в течение определенного периода времени, пока я не нуждаюсь в нем снова.
Программно отключить ограничение автомакета
Ответ 1
При разработке для iOS 8.0 или более поздней версии просто используйте свойство isActive
NSLayoutConstraint
после создания вашего IBOutlet.
ОБНОВЛЕНО
- чтобы иметь сильную ссылку на выход на предложение ниже, спасибо @rob mayoff.
- использовать .isActive вместо .active с Swift 4 на предложение ниже, спасибо @Mohit Singh.
у вашей ячейки будет следующая розетка:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
и вы получите доступ к ограничению в willDisplayCell
, например:
myCell.photoBottomConstraint.isActive = false
и когда вам это нужно снова:
myCell.photoBottomConstraint.isActive = true
Ответ 2
Основываясь на ответе oyalhi, также хочу указать, что вам нужно сделать ссылку на свои ограничения, если вы хотите сделать ее неактивной:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
Это не очевидно, но если вы используете слабую ссылку, photoBottomConstraint
может быть nil после этого вызова:
myCell.photoBottomConstraint.active = false
Ответ 3
Вы используете NSView
removeConstraint:
; если вы создали ограничение в построителе интерфейса, вы подключите его к коду через IBOutlet
class MyView : NSView {
@IBOutlet var temporaryConstraint : NSLayoutConstraint!
var constraint : NSLayoutConstraint! = nil /* my strong link */
var constraintShowing : Bool
func awakeFromNib() {
constraint = temporaryConstraint
}
func toggleLayoutConstraint(sender : AnyObject) -> () {
if constraintShowing {
self.removeConstraint( constraint )
} else {
self.addConstraint( constraint )
}
constraintShowing = !constraintShowing
}
}
Похоже на танец, который мы имели обыкновение делать с NSTableColumns
за 10.4 дней до того, как они могут быть скрыты.
Вы также можете сделать небольшой гаджет-контроллер
class ConstraintController {
var constraint : NSLayoutConstraint
var view : NSView
var show : Bool {
didSet {
if show {
view.addConstraint(constraint)
} else {
view.removeConstraint(constraint)
}
}
}
init (c : NSLayoutConstraint, inView : NSView) {
constraint = c
view = inView
show = true
}
}
class MyView : NSView {
@IBOutlet var temporaryConstraint : NSLayoutConstraint!
var control : ConstraintController? = nil
func awakeFromNib() -> () {
control = ConstraintController(temporaryConstraint, inView: self)
}
func show(sender : AnyObject!) -> () {
control!.show
}
func hide(sender : AnyObject!) -> () {
control!.hide
}
}
Больше строк, но, возможно, легче понять и менее хакерски.