如何在隐藏/显示其父NSToolbar时阻止NSImageView丢失动画?

时间:2018-03-07 04:22:19

标签: swift macos core-animation appkit

Xcode: 9.2。
macOS目标: 10.13

当父NSToolbar被隐藏然后显示时,NSImageView似乎会丢失添加到其图层的任何动画。

enter image description here

有没有办法指示AppKit动手/恢复动画状态?

示例代码

$('select[name="state"]').on('change', function(){
    let $state = $(this);
    let $regionSelect = $('select[name="region"]');

    $regionSelect.empty(); // remove all options from the region

    // loop our hidden divs to find matching regions by state selected val
    $('.hidden-regions > div').each(function(){
        let $region = $(this);

        // if our data-state attribute matches the selected state value
        if ($region.data('state') === $state.val()) {
           $state.append('<option value="'+ $region.data('region') +'">'+ $region.data('region') +'</option>');
        }
    });

});

Sample Xcode project on GitHub

1 个答案:

答案 0 :(得分:1)

通常,当从屏幕上的图层树中删除图层时,动画被视为“已完成”。默认情况下,动画完成时会从其图层中删除动画。 AppKit从窗口中删除工具栏视图(及其所有子视图及其图层),因此动画被视为已完成并从其图层中删除。

要保持动画的安装,您可以将动画的isRemovedOnCompletion设置为false

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet var customItem: NSToolbarItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let view = customItem.view!
        view.wantsLayer = true
        let layer = view.layer!
        let frame = layer.frame
        layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        layer.frame = frame

        let animation = CABasicAnimation(keyPath: "transform.rotation")
        animation.fromValue = CGFloat(0)
        animation.toValue = 2 * CGFloat.pi
        animation.duration = 1
        animation.repeatCount = .infinity
        animation.isRemovedOnCompletion = false
        layer.add(animation, forKey: animation.keyPath)
    }

}

结果:

demo