Я создал пользовательский сборщик, который раскрывает элементы сборщика при нажатии.
Теперь я пытаюсь использовать два из этих сборщиков в другом представлении, в котором показывает только сборщик, с которым пользователь в настоящее время взаимодействует и скрывает другого, но в анимации 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
Как разрешить конфликты анимации Swiftui ⇐ IOS
Программируем под IOS
1741349720
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()
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79491471/how-to-resolve-swiftui-animation-conflicts[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия