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

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

Мой текущий код:
Код: Выделить всё
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
Мобильная версия