El resultado que quiero lograr es este: Kext Wizard:
Puedo cambiar el tamaño del marco pero sin ninguna animación. Aquí está mi código simple hasta ahora (no me importaba demasiado el tamaño, pero me enfocaba en la animación):
@IBAction func disclosureButton(_ sender: Any) { if disclosureButton.state == .on { Swift.print("On") kextScroll.setFrameOrigin(kextScroll.frame.origin) kextScroll.setFrameSize(NSSize(width: 417, height: 316)) //let rectBig = NSRect(origin: kextScroll.frame.origin, size: NSSize(width: 417, height: 316)) //kextScroll.window?.setFrame(rectBig, display: true, animate: true) } else if disclosureButton.state == .off { Swift.print("Off") kextScroll.setFrameOrigin(kextScroll.frame.origin) kextScroll.setFrameSize(NSSize(width: 417, height: 200)) } }Además, si alguien puede dar una pista sobre cómo mostrar el menú oculto a medida que se reduce el tamaño del marco, sería genial. Gracias.
Ok, el problema se resolvió al agregar NSView para que se establezca como límite. Aquí está el código completo y la imagen de 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() } }Entonces, el código anterior se asegura de que todos los elementos se muevan al mismo ritmo, solo se ve el gif de preguntas. Todos los elementos ocultos deben estar en un NSView pequeño para que se muestren correctamente.
Entonces, el elemento será invisible si está fuera de NSView. Cuando el elemento se mueve al rango de NSView, no bloqueará otros elementos en ViewController. ¡Problema resuelto!