I want an NSWindow with fullSizeContentView to take the exact size of a SwiftUI view that has an "intrinsic" content size. I know I could use a frame at the top with a fixed size and that works but I can't do that since the content is dynamic. I want SwiftUI to compute the width and height of the content view and to have the window size to be exactly the size of the view.
How can I do that?
This is a Playground snippet that runs in Xcode 14.1.
import AppKit
import SwiftUI
class MyWindow: NSWindow {
override func setFrame(_ frameRect: NSRect, display flag: Bool) {
print("\(Date().timeIntervalSince1970) setFrame called \(frameRect)")
super.setFrame(frameRect, display: flag)
}
}
let window = MyWindow()
window.styleMask = [
.titled,
.closable,
.resizable,
.fullSizeContentView
]
window.toolbar = nil
window.titlebarAppearsTransparent = true
window.titleVisibility = .hidden
window.isMovable = true
window.isMovableByWindowBackground = true
window.standardWindowButton(.closeButton)?.isHidden = false
window.standardWindowButton(.miniaturizeButton)?.isHidden = true
window.standardWindowButton(.zoomButton)?.isHidden = true
print("\(Date().timeIntervalSince1970) Before content \(window.frame)")
window.contentView = NSHostingView(rootView: ContentView())
print("\(Date().timeIntervalSince1970) After setting content \(window.frame)")
window.makeKeyAndOrderFront(nil)
print("\(Date().timeIntervalSince1970) After makeKeyAndOrderFront \(window.frame)")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print("\(Date().timeIntervalSince1970) After 1 second \(window.frame)")
}
struct ContentView: View {
var body: some View {
Text("Hello")
.font(.system(size: 200))
.background(.blue)
.fixedSize()
.ignoresSafeArea()
}
}
The problem is that it leaves some space at the end. Why is this code behaving like that?
It prints this:
1674086812.362426 setFrame called (100.0, 100.0, 100.0, 100.0)
1674086812.363435 Before content (100.0, 100.0, 100.0, 100.0)
1674086812.373186 setFrame called (100.0, -63.0, 431.0, 263.0)
1674086812.3741732 After setting content (100.0, -63.0, 431.0, 263.0)
1674086812.374618 setFrame called (100.0, 85.0, 431.0, 263.0)
1674086812.375651 After makeKeyAndOrderFront (100.0, 85.0, 431.0, 263.0)
1674086812.4359 setFrame called (100.0, 57.0, 431.0, 291.0)
1674086813.41998 After 1 second (198.0, 99.0, 431.0, 291.0)
Why is SwiftUI setting the frame with a different size after showing it?
Post
Replies
Boosts
Views
Activity
I want to implement a behavior similar to unhiding the dock macOS.
So I added a borderless transparent window snapped to the side of the screen. It has a transparent click-trough NSView to track mouse position. When mouse stays in the same position of this tracking view for some milliseconds, I show a content view.
The problem is that mouse move events are not showing up consistently. I receive some mouse move events and then they stop working.
The problem doesn't happen if the view has a layer with a non transparent color.
Any ideas? Thanks!
Is there any macOS API for implementing a custom macOS dock?
I want my custom dock to stay on a different part of the screen, let's say, snapped to the right of my screen, and interact with windows the same way the native dock does.
I could implement a non draggable window for positioning purposes but what I really want is this dock to interact with other windows and desktop icons as if it's the actual dock.
Specifically, I want that maximizing windows, like when double clicking on the title bar, not to go behind my custom dock. Also, I would like desktop icons not to go behind the dock.
Is it possible to implement that in macOS, preferably in Swift?
I know I could hook the accessibility API to try to move windows around but I'd prefer to avoid this workaround. I don't want to correct window positions, I want them not to go behind the dock in the first place when maximizing them.
Thanks.
I am trying to setup a kAudioUnitSubType_VoiceProcessingIO audio unit for a VoIP macOS app. I tried kAudioUnitSubType_HALOutput first, but it was not suitable due to echo and noise, which makes sense.
kAudioUnitSubType_VoiceProcessingIO seemed promising. However, when using it with a bluetooth headset for output and built-in mic for input, volume gets really low compared to other device setups such as both internal input and output, or both bluetooth headset input and output. The alternative setups seem to work fine, but we can't request users to avoid specific setups. This makes kAudioUnitSubType_VoiceProcessingIO unusable for a macOS app.
Is kAudioUnitSubType_VoiceProcessingIO production ready for current macOS apps? Is there any way to avoid the volume issues?
Adding manual gain is not a workaround because voice becomes really distorted.
Thanks.