Как поместить кнопку SwiftUI в NSToolbar? - PullRequest
3 голосов
/ 23 октября 2019

Вот как SwiftUI может быть вставлен в NSToolbar с помощью дополнительного контроллера вида:

import SwiftUI
import PlaygroundSupport

var hostingView = NSHostingView(rootView:
  ZStack {
    Color.clear
    HStack {
      Text("Hey")
      Text("SwiftUI")
    }
  }
  .padding()
  .edgesIgnoringSafeArea(.all)
)
hostingView.frame.size = hostingView.fittingSize

let titlebarAccessory = NSTitlebarAccessoryViewController()
titlebarAccessory.view = hostingView
titlebarAccessory.layoutAttribute = .trailing

let mask: NSWindow.StyleMask = [.titled, .closable, .miniaturizable, .resizable]
let window = NSWindow(
  contentRect: .init(x: 0, y: 0, width: 480, height: 300),
  styleMask: mask, backing: .buffered, defer: false)
window.center()
window.contentView = NSHostingView(rootView: Color(.windowBackgroundColor))
window.toolbar = .init()
window.titleVisibility = .hidden
window.addTitlebarAccessoryViewController(titlebarAccessory)

PlaygroundPage.current.liveView = window.contentView?.superview

Приведенный выше код работает:

Однако, если мы вставим кнопку:

HStack {
  Text("Hey")
  Button(action: {}) {
    Text("SwiftUI")
  }
}

Она не будет работать должным образом:

Есть предложения?

PS Это рабочее решение:

HStack {
  Text("Hey")
    .offset(x: 0, y: -1)
  Button(action: {}) {
    Text("SwiftUI")
      .offset(x: 0, y: -7)
  }
}
.font(.caption)

1 Ответ

1 голос
/ 28 октября 2019

Размещение моего комментария в качестве ответа на запрос. Не обязательно надежное решение, но в качестве обходного пути вы можете использовать

Text("SwiftUI")
  .padding(EdgeInsets(top: -7, leading: 0, bottom: 0, trailing: 0))

или .offset для текста в кнопке. Нет гарантий того, как долго это будет продолжаться в качестве решения.

...