Подтвердить что ты не робот

Программно отключить ограничение автомакета

Есть ли какой-либо программный способ временно отключить ограничение автоматической компоновки? Я не хочу, чтобы это ограничение рассматривалось в течение определенного периода времени, пока я не нуждаюсь в нем снова.

4b9b3361

Ответ 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
    }
}

Больше строк, но, возможно, легче понять и менее хакерски.