Hi,
Is it possible to change the anchorpoint of NSView if I don't use layer?
If not how can I use layer and still draw my notch?
import Cocoa
import Combine
class NotchView: NSView {
private var mouseDownSubject = PassthroughSubject<NSPoint, Never>()
var mouseDownPublisher: AnyPublisher<NSPoint, Never> {
return mouseDownSubject.eraseToAnyPublisher()
}
//Draw notch
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
drawNotch()
}
func drawNotch () {
let size = self.frame.size
let r: CGFloat = 16.0
let gap: CGFloat = 1.0
let notch = NSBezierPath()
notch.move(to: NSPoint(x: 0.0, y: size.height))
notch.curve(to: NSPoint(x: r, y: size.height - r),
controlPoint1: NSPoint(x: r - gap, y: size.height),
controlPoint2: NSPoint(x: r, y: size.height - gap))
notch.line(to: NSPoint(x: r, y: r))
notch.curve(to: NSPoint(x: 2 * r, y: 0.0),
controlPoint1: NSPoint(x: r, y: gap),
controlPoint2: NSPoint(x: r + gap, y: 0.0))
notch.line(to: NSPoint(x: size.width - 2 * r, y: 0.0))
notch.curve(to: NSPoint(x: size.width - r, y: r),
controlPoint1: NSPoint(x: size.width - r - gap, y: 0.0),
controlPoint2: NSPoint(x: size.width - r, y: gap))
notch.line(to: NSPoint(x: size.width - r, y: size.height - r))
notch.curve(to: NSPoint(x: size.width, y: size.height),
controlPoint1: NSPoint(x: size.width - r, y: size.height - gap),
controlPoint2: NSPoint(x: size.width - r + gap, y: size.height))
notch.close()
NSColor.systemPink.setFill() //change to black to see the notch
notch.fill()
}
//Tap with mouse
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
//move notch to top
mouseDownSubject.send(event.locationInWindow)
}
}
Post
Replies
Boosts
Views
Activity
Hi
I'm trying to resize my NSPanel with spring animation but I have a position problem (the panel is not on center of screen) when I make the panel bigger (see the video)
How can I fix it?
Video:
https://streamable.com/l4281l
func animationBigger () {
let jump = CASpringAnimation(keyPath: "transform.scale")
jump.damping = 60
jump.mass = 10
jump.initialVelocity = 10
jump.stiffness = 200.0
jump.fromValue = 1.0
jump.toValue = 2.0
jump.duration = 0.4
//self is NSPanel
self.contentView?.layer!.add(jump, forKey: nil)
self.setContentSize(bignotchSize)
}
class NotchView: NSView {
private var mouseDownSubject = PassthroughSubject<NSPoint, Never>()
var mouseDownPublisher: AnyPublisher<NSPoint, Never> {
return mouseDownSubject.eraseToAnyPublisher()
}
//Draw notch
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
drawNotch()
}
func drawNotch () {
self.layer?.anchorPoint = CGPoint(x: 0.0, y: 0.0)
let size = self.frame.size
let r: CGFloat = 15.0
let gap: CGFloat = 1.0
let notch = NSBezierPath()
notch.move(to: NSPoint(x: 0.0, y: size.height))
notch.curve(to: NSPoint(x: r, y: size.height - r),
controlPoint1: NSPoint(x: r - gap, y: size.height),
controlPoint2: NSPoint(x: r, y: size.height - gap))
notch.line(to: NSPoint(x: r, y: r))
notch.curve(to: NSPoint(x: 2 * r, y: 0.0),
controlPoint1: NSPoint(x: r, y: gap),
controlPoint2: NSPoint(x: r + gap, y: 0.0))
notch.line(to: NSPoint(x: size.width - 2 * r, y: 0.0))
notch.curve(to: NSPoint(x: size.width - r, y: r),
controlPoint1: NSPoint(x: size.width - r - gap, y: 0.0),
controlPoint2: NSPoint(x: size.width - r, y: gap))
notch.line(to: NSPoint(x: size.width - r, y: size.height - r))
notch.curve(to: NSPoint(x: size.width, y: size.height),
controlPoint1: NSPoint(x: size.width - r, y: size.height - gap),
controlPoint2: NSPoint(x: size.width - r + gap, y: size.height))
notch.close()
NSColor.black.setFill() //change to black to see the notch
notch.fill()
}```
```language
class NotchPanel: NSPanel, CAAnimationDelegate {
private (set) var notchView = NotchView()
var notchClickPublisher: AnyPublisher<NSPoint, Never> {
return notchView.mouseDownPublisher
}
init(_ center: NSPoint,_ size: NSSize) {
let notchFrame = NSRect(x: center.x - 0.5 * size.width,
y: center.y - size.height,
width: size.width,
height: size.height)
super.init(contentRect: notchFrame,
styleMask: [ .nonactivatingPanel,.nonactivatingPanel, .hudWindow],
backing: .buffered,
defer: true)
self.level = .popUpMenu
self.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
self.isOpaque = true
self.isMovable = false //Disable notch to be moveable
self.hasShadow = false //we do custom shadow later
self.backgroundColor = NSColor.systemPink //notch background
setNotchView()
}
private func setNotchView() {
self.contentView?.addSubview(notchView)
notchView.translatesAutoresizingMaskIntoConstraints = false
notchView.leftAnchor
.constraint(equalTo: self.contentView!.leftAnchor)
.isActive = true
notchView.topAnchor
.constraint(equalTo: self.contentView!.topAnchor)
.isActive = true
notchView.rightAnchor
.constraint(equalTo: self.contentView!.rightAnchor)
.isActive = true
notchView.bottomAnchor
.constraint(equalTo: self.contentView!.bottomAnchor)
.isActive = true
}```
Hi,
I'm trying to resize my rect with CABasicAnimation and the animation go to up and not down
How can I change it?
Video:
https://streamable.com/nw4ekc
Thank you!
let newFrame = NSRect(x: blueRect.frame.origin.x, y: blueRect.frame.origin.y - 100,width: blueRect.frame.size.width, height: 200)
let animation = CABasicAnimation(keyPath: "bounds")
animation.fromValue = NSValue(rect: blueRect.frame)
animation.toValue = NSValue(rect: newFrame)
animation.duration = 0.5 // Animation duration in seconds
blueRect.layer?.add(animation, forKey: "sizeAnimation")
// Update the rect view's size and origin
blueRect.frame = newFrame
Hi
How can I detect if user get push notification on macOS?
Thanks!
Hi,
I just add airplay to my app and I tried to stream to my TV but not works
AirPlay code:
//Airplay button
let routePickerView = AVRoutePickerView.init(frame: airplayButton.frame)
routePickerView.isRoutePickerButtonBordered = false
self.view.addSubview(routePickerView)let asset = AVAsset(url: URL(string: "https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8")!)
Hi,
How can I add vibrancy to image/NSButton for example my play button (macOS)
I found a SwiftUI library for this but I don't use swift UI
https://github.com/lucasbrown/swiftui-visual-effects
My app
Hi,
I just updated to macOS Monterey and Xcode 13.1 and the NSButtons on my view not work anymore I tap and nothing work
let visualEffect = NSVisualEffectView()
//var theme = NSAppearance(appearanceNamed: NSAppearance.Name.vibrantDark, bundle: nil)
visualEffect.translatesAutoresizingMaskIntoConstraints = false
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.wantsLayer = true
visualEffect.layer?.cornerRadius = roundvalueDefault.value(forKey: "roundvaluekey") as! CGFloat
visualEffect.layer?.opacity = 0.0
window?.isOpaque = false
window?.backgroundColor = .clear //Make window transpraent
window?.isMovableByWindowBackground = true
checkAlt() //Check if floating
//Custom toolbar
let customToolbar = NSToolbar()
customToolbar.isVisible = true
window?.titleVisibility = .hidden
window?.styleMask.insert(.fullSizeContentView)
window?.titlebarAppearsTransparent = true
customToolbar.showsBaselineSeparator = false
window?.contentView?.wantsLayer = true
window?.toolbar = customToolbar
//Change windows radius
//Add the blur effcet to the window
window?.contentView?.addSubview(visualEffect)
guard let constraints = window?.contentView else {
return
}
visualEffect.leadingAnchor.constraint(equalTo: constraints.leadingAnchor).isActive = true
visualEffect.trailingAnchor.constraint(equalTo: constraints.trailingAnchor).isActive = true
visualEffect.topAnchor.constraint(equalTo: constraints.topAnchor).isActive = true
visualEffect.bottomAnchor.constraint(equalTo: constraints.bottomAnchor).isActive = true
}
@IBAction func airplayTapped(_ sender: Any) {
print("AAA")
}
Hi,
I'm trying to add a drop shadow for NSImageView with NSBeizerPath but the shadow does not appear
//add cgPath var to NSBezierPath
extension NSBezierPath {
public var cgPath: CGPath {
let path = CGMutablePath()
var points = [CGPoint](repeating: .zero, count: 3)
for i in 0 ..< elementCount {
let type = element(at: i, associatedPoints: &points)
switch type {
case .moveTo:
path.move(to: points[0])
case .lineTo:
path.addLine(to: points[0])
case .curveTo:
path.addCurve(to: points[2], control1: points[0], control2: points[1])
case .closePath:
path.closeSubpath()
@unknown default:
continue
}
}
return path
}
}
//View
var albumImage = NSImageView()
albumImage.layer?.shadowRadius = 10.0
albumImage.layer?.shadowColor = .black
albumImage.layer?.shadowOffset = CGSize(width: 10, height: 10)
albumImage.layer?.shadowOpacity = 1.0
albumImage.layer?.shadowPath = NSBezierPath(roundedRect: albumImage.bounds, xRadius: 28.0, yRadius: 28.0).cgPath
Hi,
How can I show the avaliable list device for AirPlay like this?
Hi,
I override keyUp function to detect if the space key is press everything works but the screen blink with a white flash every time I press space key how can I fix it?
override func keyUp(with event: NSEvent) {
//Tap on escape 0x31 = Space
if event.keyCode == UInt16(0x31){
print("Hello")
}
}
Hi,
How can make auto-scroll label with NSTextField like in the iTunes app?
Thanks!
Hi,
How can I override property shadowColor from NSShadow?
thanks!
HI,
Is it possible to add a private framework to the project?
I tried to import MediaRemote.framework but Xcode does not find the framework also when I added the path to the framework in Framework linker
Hi,
How can I pause/play the now playing song with MedaiRemote framework
Thanks!
Hi,
I'm using NSButton and the vibrancy effect works only when the system is in dark mode
How can I get a vibrancy effect also on light mode?