Мне нужно разместить несколько кнопок с текстом и изображением на панели инструментов клавиатуры, и я хочу вставить разделители, чтобы они располагались равномерно. Это работало на iOS 18. Однако на iOS 26 все загромождено. См. картинку:
Вот минимальный репродукция, с которой вы можете поиграть:
import SwiftUI
struct ContentView: View {
@State var text: String = ""
var body: some View {
NavigationStack {
List {
TextField("Click Me", text: $text)
Text("Hello, world!").font(Font.system(size: 32))
Text("Hello, world!").font(Font.system(size: 32))
Text("Hello, world!").font(Font.system(size: 32))
Text("Hello, world!").font(Font.system(size: 32))
Text("Hello, world!").font(Font.system(size: 32))
}
.toolbar {
ToolbarItemGroup(placement: .topBarLeading) {
Button {
} label: {
Text("Toggle")
}
}
}
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
keyboardButtons
}
}
}
.navigationTitle("Hello")
}
@ViewBuilder
private var keyboardButtons: some View {
HStack {
SUITextButton("Button") {}
Spacer()
SUIImageButton(
image: UIImage(
systemName: "chevron.left",
withConfiguration: UIImage.SymbolConfiguration(pointSize: 32, weight: .regular, scale: .small)
)!,
enabled: true
) {}
Spacer()
SUIImageButton(
image: UIImage(
systemName: "chevron.right",
withConfiguration: UIImage.SymbolConfiguration(pointSize: 32, weight: .regular, scale: .small)
)!,
enabled: true
) {}
Spacer()
SUITextButton("Button") {}
}
}
}
#Preview {
ContentView()
}
public struct SUITextButton: View {
private let title: String
private let action: () -> Void
private let enabled: Bool
public init(_ title: String, enabled: Bool = true, action: @escaping () -> Void) {
self.title = title
self.enabled = enabled
self.action = action
}
public var body: some View {
Button(title, action: action)
}
}
public struct SUIImageButton: View {
public init(image: UIImage, enabled: Bool, action: @escaping () -> Void) {
self.image = image
self.enabled = enabled
self.action = action
}
private let image: UIImage
private let enabled: Bool
private let action: () -> Void
public var body: some View {
Button(action: action) {
SUIImage(
uiImage: image,
// Since it's inside of a button, it will be blue when enabled, and gray when disabled.
rendering: .systemTint)
}
}
}
public struct SUIImage: View {
public enum Rendering {
case systemTint
case customColor(color: UIColor)
case original
}
private let uiImage: UIImage
private let rendering: Rendering
public init(uiImage: UIImage, rendering: Rendering) {
self.uiImage = uiImage
self.rendering = rendering
}
public var body: some View {
let width: CGFloat = 18.0 + (2.0 / 3.0)
let height: CGFloat = 26.0 + (2.0 / 3.0)
Image(uiImage: uiImage)
.renderingMode(.template)
}
}
Установка флага UIDesignRequriesCompatibility сработала, но мне нужен эффект стекла для других частей моего приложения (и я думаю, что эффект стекла над клавиатурой выглядит лучше). Так что это не вариант.
Мне нужно разместить несколько кнопок с текстом и изображением на панели инструментов клавиатуры, и я хочу вставить разделители, чтобы они располагались равномерно. Это работало на iOS 18. Однако на iOS 26 все загромождено. См. картинку: [img]https://i.sstatic.net/itBFvKqj.png[/img]
Вот минимальный репродукция, с которой вы можете поиграть: [code] import SwiftUI
struct ContentView: View { @State var text: String = "" var body: some View { NavigationStack { List { TextField("Click Me", text: $text)
private let image: UIImage private let enabled: Bool private let action: () -> Void
public var body: some View { Button(action: action) { SUIImage( uiImage: image, // Since it's inside of a button, it will be blue when enabled, and gray when disabled. rendering: .systemTint) } }
}
public struct SUIImage: View {
public enum Rendering { case systemTint case customColor(color: UIColor) case original }
private let uiImage: UIImage private let rendering: Rendering
[/code] Установка флага UIDesignRequriesCompatibility сработала, но мне нужен эффект стекла для других частей моего приложения (и я думаю, что эффект стекла над клавиатурой выглядит лучше). Так что это не вариант.