Как разрешить конфликты анимации SwiftuiIOS

Программируем под IOS
Ответить
Anonymous
 Как разрешить конфликты анимации Swiftui

Сообщение Anonymous »

Я создал пользовательский сборщик, который раскрывает элементы сборщика при нажатии.
Теперь я пытаюсь использовать два из этих сборщиков в другом представлении, в котором показывает только сборщик, с которым пользователь в настоящее время взаимодействует и скрывает другого, но в анимации Picker в настоящее время прячутся паус на мгновение. https://imgur.com/a/gitlrit
Вот код ниже:
struct ConceptOptionsView: View {
@State private var aspectRatio: AspectRatio = .sixteenbynine
@State private var imageModel: ImageModel = .flux(.schnell)
@State private var resolution: ImageResolution = .seventwenty
@State private var activePicker: ActivePicker? = nil

enum ActivePicker {
case model
case resolution
}

var body: some View {
VStack(spacing: 0) {
Rectangle()
.fill(.gray.opacity(0.3))
.frame(height: 0.5)
.frame(maxWidth: .infinity)
VStack(alignment: .leading, spacing: 20) {

HStack {
if activePicker == nil || activePicker == .model {
PillSelectorView(
title: "Model",
icon: "sparkle",
selection: $imageModel,
items: ImageModel.pickerItems,
didBeginSelection: {
activePicker = .model
},
didEndSelection: {
activePicker = nil
}
)
.transition(.move(edge: .leading))
}
Spacer()
if activePicker == nil || activePicker == .resolution {
PillSelectorView(
title: "Resolution",
icon: "camera.metering.center.weighted.average",
selection: $resolution,
items: ImageResolution.pickerItems,
didBeginSelection: { activePicker = .resolution },
didEndSelection: { activePicker = nil }
)
.transition(.move(edge: .trailing))
}
}

Text("The options you select will be the starting point when you want to generate a new image")
.font(.footnote)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 20)
}
.padding()
Spacer()
}
.background(.ultraThinMaterial)
.animation(.snappy, value: activePicker)
}
}
< /code>
struct PillSelectorItem: Identifiable {
let id = UUID()
let value: SelectionValue
let title: String

init(
value: SelectionValue,
title: String
) {
self.value = value
self.title = title
}
}

struct PillSelectorView: View {
let title: String
let icon: String
@Binding var selection: SelectionValue
let items: [PillSelectorItem]
var didBeginSelection: () -> Void
var didEndSelection: () -> Void

@State private var isSelecting: Bool = false

var body: some View {
VStack(alignment: .leading, spacing: 5) {
Text(title)
.font(.caption.weight(.medium))
.foregroundStyle(.secondary)
.padding(.leading, 10)
HStack {
Button {
withAnimation {
isSelecting.toggle()
}
} label: {
HStack {
Image(systemName: icon)
.imageScale(.small)
if !isSelecting {
Text(items.first(where: { $0.value == selection })?.title ?? "Item")
.font(.subheadline.weight(.medium))
}
}
.padding(.horizontal)
.padding(.vertical, 12)
.frame(maxWidth: isSelecting ? 40 : .infinity)
.background(.gray.opacity(0.1), in: .rect(cornerRadius: 20))
}
.buttonStyle(.plain)

if isSelecting {
ScrollView(.horizontal) {
HStack {
ForEach(items) { item in
Button {
withAnimation {
selection = item.value
isSelecting = false
}
} label: {
Text(item.title)
.font(.footnote.weight(.medium))
.foregroundStyle(
item.value == selection ? .primary : .secondary
)
.padding(.vertical, 10)
.padding(.horizontal, 10)
.overlay {
Capsule()
.fill(
item.value == selection ? .gray.opacity(0.1) : .clear
)
.stroke(
item.value == selection
? .primary : Color.gray.opacity(0.3), lineWidth: 1.0
)
}
}
.buttonStyle(.plain)
}
}
}
.scrollIndicators(.hidden)
.transition(.move(edge: .trailing))
}
}
}
.onChange(of: isSelecting) { oldValue, newValue in
newValue ? didBeginSelection() : didEndSelection()
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... -conflicts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»