Меню SwiftUI всегда отображается вверху метки – как показать его в центре области нажатия?IOS

Программируем под IOS
Ответить
Anonymous
 Меню SwiftUI всегда отображается вверху метки – как показать его в центре области нажатия?

Сообщение Anonymous »

Я создаю компонент загрузки фотографий в SwiftUI, где вся прямоугольная область должна быть доступна для касания, чтобы отобразить меню с параметрами (библиотека фотографий / камера).
Проблема: независимо от того, что я пытаюсь, всплывающее меню всегда появляется, привязанное к ВЕРХНЕЙ части метки, но мне нужно, чтобы оно появлялось в ЦЕНТРЕ касающегося прямоугольника.
Текущее поведение:
Изображение

Ожидаемое поведение: меню должно располагаться в центре этой области:
Изображение

Мой текущий код:

Код: Выделить всё

import SwiftUI
import PhotosUI

struct PhotoUploaderExample: View {
@State private var selectedImage: UIImage?
@State private var showingImagePicker = false
@State private var showingCamera = false

private let placeholderSide: CGFloat = UIScreen.main.bounds.width - 32

var body: some View {
VStack(alignment: .leading, spacing: 12) {
Text("Add a photo")
.font(.system(size: 20, weight: .semibold))

photoUploadArea
}
.padding(.horizontal, 16)
.sheet(isPresented: $showingImagePicker) {
// Photo library picker
}
.fullScreenCover(isPresented: $showingCamera) {
// Camera
}
}

var photoUploadArea: some View {
ZStack {
// Background rectangle with dashed border
RoundedRectangle(cornerRadius: 24)
.fill(Color.gray.opacity(0.05))
.strokeBorder(
Color.gray.opacity(0.3),
style: StrokeStyle(lineWidth: 2, dash: [8, 5])
)
.frame(width: placeholderSide, height: placeholderSide)

// Content overlay - icon and button
VStack(spacing: 12) {
Image(systemName: "photo.badge.plus.fill")
.resizable()
.scaledToFit()
.frame(width: 48, height: 48)

Text("Add a photo")
.font(.system(size: 15, weight: .medium))
.padding(.horizontal, 20)
.padding(.vertical, 8)
.background(Color.gray.opacity(0.1))
.clipShape(Capsule())
}

// Menu - stretched to fill entire area
Menu {
Button(action: {
showingImagePicker = true
}) {
Label("Photo Library", systemImage: "photo.on.rectangle")
}

Button(action: {
showingCamera = true
}) {
Label("Camera", systemImage: "camera")
}
} label: {
Color.clear
.contentShape(Rectangle())
}
.frame(width: placeholderSide, height: placeholderSide)
}
}
}

#Preview {
PhotoUploaderExample()
}
Что я пробовал:
  • Обертывание меню в разные представления контейнера
  • Использование Color.clear в качестве метки с .contentShape(Rectangle())
  • Размещение небольшой невидимой привязки в центре
Вопросы:
  • Есть ли какой-либо собственный способ управления положением привязки всплывающего меню?
    Ищите только собственные решения SwiftUI — никаких сторонних библиотек.
Цель: При нажатии в любом месте внутри прямоугольника (а не только на значке/кнопке) меню должно отображаться в центре этой области.

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

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

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

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

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

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