Skip to content

Instantly share code, notes, and snippets.

@KevinGutowski
Created June 23, 2019 07:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save KevinGutowski/b26eb01f79303275670af088a0b991aa to your computer and use it in GitHub Desktop.
Save KevinGutowski/b26eb01f79303275670af088a0b991aa to your computer and use it in GitHub Desktop.
Animating the background blur of a NSView that is layer backed
let threadDictionary = NSThread.mainThread().threadDictionary()
let panelID = "com.betterTypePanel.panel"
if (threadDictionary[panelID]) {
let panel = threadDictionary[panelID]
panel.close()
threadDictionary.removeObjectForKey(panelID)
}
var panelWidth = 312
var panelHeight = 210
let panel = NSPanel.alloc().init()
panel.setFrame_display(NSMakeRect(0, 0, panelWidth, panelHeight), true)
panel.setStyleMask(NSTexturedBackgroundWindowMask | NSTitledWindowMask | NSClosableWindowMask)
panel.title = "Testing"
panel.center()
panel.makeKeyAndOrderFront(null)
panel.setLevel(NSFloatingWindowLevel)
panel.standardWindowButton(NSWindowMiniaturizeButton).setHidden(true)
panel.standardWindowButton(NSWindowZoomButton).setHidden(true)
threadDictionary[panelID] = panel
let mySubview = NSView.new()
mySubview.setFrame(NSMakeRect(0,0,panelWidth,panelHeight))
panel.contentView().wantsLayer = true
let image = NSImage.alloc().initByReferencingFile("/Users/Kski/Downloads/1*OdrksoSetcAcPRJxhvbWcQ.png")
panel.contentView().layer().setContents(image)
panel.contentView().addSubview(mySubview)
mySubview.wantsLayer = true
let myLayer = CALayer.layer()
mySubview.setLayer(myLayer)
myLayer.setBackgroundColor(NSColor.colorWithRed_green_blue_alpha(0.0,0.0,0.0,0.7).CGColor())
let blurFilter = CIFilter.filterWithName("CIGaussianBlur")
blurFilter.setDefaults()
blurFilter.setValue_forKey(4, 'inputRadius')
blurFilter.setName('blur')
myLayer.setBackgroundFilters([blurFilter])
let blurAnimation = CABasicAnimation.animation()
blurAnimation.setKeyPath("backgroundFilters.blur.inputRadius")
blurAnimation.setFromValue(0)
blurAnimation.setToValue(4)
let opacityAnimation = CABasicAnimation.animation()
opacityAnimation.setKeyPath("opacity")
opacityAnimation.setFromValue(0)
opacityAnimation.setToValue(1)
let animationGroup = CAAnimationGroup.animation()
animationGroup.setDuration(0.25)
animationGroup.setTimingFunction(CAMediaTimingFunction.functionWithName("easeInEaseOut"))
animationGroup.setAnimations([blurAnimation,opacityAnimation])
myLayer.addAnimation_forKey(animationGroup, "fadeIn")
let blurAnimationReverse = CABasicAnimation.animation()
blurAnimationReverse.setKeyPath("backgroundFilters.blur.inputRadius")
blurAnimationReverse.setFromValue(4)
blurAnimationReverse.setToValue(0)
let opacityAnimationReverse = CABasicAnimation.animation()
opacityAnimationReverse.setKeyPath("opacity")
opacityAnimationReverse.setFromValue(1)
opacityAnimationReverse.setToValue(0)
let animationGroup2 = CAAnimationGroup.animation()
animationGroup2.setDuration(0.25)
animationGroup2.setTimingFunction(CAMediaTimingFunction.functionWithName("easeInEaseOut"))
animationGroup2.setAnimations([blurAnimationReverse,opacityAnimationReverse])
setTimeout(function(){
myLayer.removeAllAnimations()
myLayer.addAnimation_forKey(animationGroup2, "fadeOut")
}, 2000)
setTimeout(function(){
mySubview.setHidden(true)
}, 2235)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment