Хорошо, проблема решена путем добавления NSView для установки в качестве границы.Вот полный код и изображение Xcode
@IBAction func disclosureButton(_ sender: Any) {
let dHeight = 70
let smallOrigin = NSPoint(x: 20, y: 116)
let bigOrigin = NSPoint(x: 20, y: 116-dHeight)
let hideOrigin = NSPoint(x:0, y:25-dHeight)
let showOrigin = NSPoint(x:0, y:25)
if disclosureButton.state == .on {
//hide
NSAnimationContext.beginGrouping()
NSAnimationContext.current.duration = 0.2
kextScroll.animator().setFrameOrigin(bigOrigin)
kextScroll.animator().setFrameSize(NSSize(width: 417, height: 249+dHeight))
pathText.animator().setFrameOrigin(hideOrigin)
reloadButton.animator().setFrameOrigin(NSPoint(x: 269, y:51-dHeight))
unloadButton.animator().setFrameOrigin(NSPoint(x: 347, y:51-dHeight))
exportButton.animator().setFrameOrigin(NSPoint(x: 269, y:-1-dHeight))
revealButton.animator().setFrameOrigin(NSPoint(x: 347, y:-1-dHeight))
kextLabel.animator().setFrameOrigin(NSPoint(x: 0, y:52-dHeight))
NSAnimationContext.endGrouping()
} else if disclosureButton.state == .off {
//show
NSAnimationContext.beginGrouping()
NSAnimationContext.current.duration = 0.2
kextScroll.animator().setFrameOrigin(smallOrigin)
kextScroll.animator().setFrameSize(NSSize(width: 417, height: 249))
pathText.animator().setFrameOrigin(showOrigin)
reloadButton.animator().setFrameOrigin(NSPoint(x: 269, y:51))
unloadButton.animator().setFrameOrigin(NSPoint(x: 347, y:51))
exportButton.animator().setFrameOrigin(NSPoint(x: 269, y:-1))
revealButton.animator().setFrameOrigin(NSPoint(x: 347, y:-1))
kextLabel.animator().setFrameOrigin(NSPoint(x: 0, y:52))
NSAnimationContext.endGrouping()
}
}
Итак, приведенный выше код гарантирует, что все элементы движутся с одинаковой скоростью, как выглядит вопрос gif.Все скрытые элементы должны быть в небольшом NSView для правильного отображения.
Таким образом, элемент будет невидимым, если он находится за пределами NSView.Когда элемент перемещается в диапазон NSView, он не будет блокировать другие элементы в ViewController.Проблема решена!