Я пытался создать собственный ToggleStyle для управления цветом дорожки, но это означает, что я больше не использую собственный рендеринг переключателя (внешний вид и анимация не полностью соответствуют системному переключателю).
Вот упрощенная версия того, что я есть:
Код: Выделить всё
import SwiftUI
public struct CustomSwitch: View {
@Binding private var isOn: Bool
private let content: Content
public init(
isOn: Binding,
@ViewBuilder content: () -> Content
) {
self._isOn = isOn
self.content = content()
}
public var body: some View {
Toggle(isOn: $isOn) { content }
.toggleStyle(CustomSwitchToggleStyle())
}
}
private struct CustomSwitchToggleStyle: ToggleStyle {
func makeBody(configuration: Configuration) -> some View {
HStack {
configuration.label
Spacer()
ZStack {
Capsule()
// want custom OFF color
.fill(configuration.isOn ? Color.green : Color.gray)
.frame(width: 51, height: 31)
Circle()
.fill(Color.white)
.frame(width: 27, height: 27)
.shadow(radius: 2)
.offset(x: configuration.isOn ? 10 : -10)
}
.onTapGesture {
withAnimation(.easeInOut(duration: 0.2)) {
configuration.isOn.toggle()
}
}
}
}
}
Я также пробовал использовать собственный переключатель:
Код: Выделить всё
Toggle("Example", isOn: $isOn)
.toggleStyle(.switch)
.tint(.green)
Можно ли в SwiftUI изменить только неправильный (не выбранный) цвет фона собственного переключателя в стиле переключателя без переопределения/замены собственного внешнего вида?
Если нет, то какой подход рекомендуется достичь, оставаясь при этом как можно ближе к исходному (без оболочки UIKit с UISwitch)?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ive-toggle
Мобильная версия