Моя камера будет должным образом снимает и отобразит изображение, когда вы видите его в предварительном просмотре для небольших экранов телефона, таких как 2 -й Gen iPhone SE, но при выполнении того же самого на более крупном экране, например, iPhone 15, захваченный Изображение сжимается вместе. Для более крупных экранов это как будто вы получаете более широкий вид, и оно горизонтально скручивается вместе, с более экстремальным сжиманием в середине экрана. < /P>
Цель - иметь Захваченное изображение отображает изображение, которое было замечено в предварительном просмотре и захвачено, и хорошо работает в большинстве аспектов, за исключением больших экранов, сжимаясь после захвата изображения. Покажите правильно в других представлениях в приложении после его загрузки, а также в базе данных, что заставило меня полагать, что проблема может исходить от дисплея CameraView. Изменение изображения (Uiimage: Image) с. Придато, на что -то еще, не сработало, это просто усугубляет, и ни одна модель LLM не помогала, но в то же время диагностировала, откуда эта проблема проистекает. < /P>
< P> Зачем вам видеть различные результаты в зависимости от размера экрана, и как вы это предотвращаете? Я просто пытаюсь повторить общую камеру, такую как Snapchat или Instagram, и они поняли это довольно хорошо. Любая помощь будет оценена! < /P>
import SwiftUI
import AVFoundation
import Photos
struct CameraView: View {
@State private var capturedImage: UIImage? = nil
@Binding var selectedTab: Int
@ObservedObject var sharedData: SharedData
@State private var showUploadPostView = false
@State private var showingCameraSettingsAlert = false
@State private var showSaveAlert = false
@State private var saveAlertMessage = ""
@State private var showSettingsAlert = false
@StateObject private var uploadPostViewModel = UploadPostViewModel(isPresented: false)
var body: some View {
ZStack {
if AVCaptureDevice.authorizationStatus(for: .video) == .authorized ||
AVCaptureDevice.authorizationStatus(for: .video) == .notDetermined {
if let image = capturedImage {
ZStack {
Image(uiImage: image)
.resizable()
.ignoresSafeArea()
// Top-left Save Button
VStack {
HStack {
Button(action: {
saveImage(image)
}, label: {
Image(systemName: "square.and.arrow.down")
.font(.system(size: 20))
.foregroundColor(.white)
.padding()
.background(Color.black.opacity(0.6))
.clipShape(Circle())
})
.padding(.top, 40)
.padding(.leading, 20)
Spacer()
}
Spacer()
}
// To position buttons
GeometryReader { geometry in
ZStack {
// Retake Button
Button(action: {
capturedImage = nil
sharedData.capturedImage = nil
}, label: {
Image(systemName: "goforward")
.font(.largeTitle)
.font(.system(size: 12))
.padding()
.background(Color.white)
.foregroundColor(.black)
.clipShape(Circle())
})
.scaleEffect(0.86)
.position(x: 50, y: geometry.size.height - 60)
// Upload Post Button
Button(action: {
sharedData.capturedImage = capturedImage
showUploadPostView = true
}, label: {
Image(systemName: "square.and.arrow.up")
.font(.largeTitle)
.font(.system(size: 12))
.padding()
.background(Color.white)
.foregroundColor(.black)
.clipShape(Circle())
})
.scaleEffect(0.86)
.position(x: geometry.size.width - 50, y: geometry.size.height - 60)
}
}
}
.alert(isPresented: $showSaveAlert) {
if showSettingsAlert {
// Alert with two buttons: "Settings" and "OK"
return Alert(
title: Text("Save Image"),
message: Text(saveAlertMessage),
primaryButton: .default(Text("Settings"), action: {
// Open app settings
if let appSettings = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(appSettings)
}
}),
secondaryButton: .cancel(Text("OK"))
)
} else {
// Alert with a single "OK" button
return Alert(
title: Text("Save Image"),
message: Text(saveAlertMessage),
dismissButton: .default(Text("OK"))
)
}
}
} else {
CustomCameraView(capturedImage: $capturedImage)
}
} else {
// Camera access denied view
VStack {
Text("Camera Access Denied")
.font(.title)
.padding()
Text("Please enable camera access in Settings to use this feature.")
.multilineTextAlignment(.center)
.padding()
Button("Open Settings") {
UIApplication.shared.open(
URL(string: UIApplication.openSettingsURLString)!,
options: [:],
completionHandler: nil
)
}
.padding()
.foregroundColor(.white)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 10))
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.gray.opacity(0.3))
.onAppear {
showingCameraSettingsAlert = true
}
}
}
.fullScreenCover(isPresented: $showUploadPostView) {
UploadPostView(
selectedTab: $selectedTab,
sharedData: sharedData,
viewModel: uploadPostViewModel
) {
// Reset captured image after successful upload
capturedImage = nil
sharedData.capturedImage = nil
}
}
}
// Save Image and Error Handling
func saveImage(_ image: UIImage) {
let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
switch photoAuthorizationStatus {
case .authorized:
// Save the image
let imageSaver = ImageSaver()
imageSaver.successHandler = {
saveAlertMessage = "Your image has been saved to the photo gallery."
showSaveAlert = true
showSettingsAlert = false
}
imageSaver.errorHandler = { error in
saveAlertMessage = "Failed to save image: \(error.localizedDescription)"
showSaveAlert = true
showSettingsAlert = false
}
imageSaver.saveImageToPhotoAlbum(image: image)
case .denied, .restricted:
// Show alert guiding user to Settings
saveAlertMessage = "Photo library access is denied. Please enable it in Settings to save images."
showSaveAlert = true
showSettingsAlert = true
case .notDetermined:
// Request permission
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
saveImage(image)
} else {
saveAlertMessage = "Photo library access is denied. Please enable it in Settings to save images."
showSaveAlert = true
showSettingsAlert = true
}
}
case .limited:
// Handle limited access if needed
saveAlertMessage = "Photo library access is limited. The image might not be saved properly."
showSaveAlert = true
showSettingsAlert = false
// Proceed to save the image
let imageSaver = ImageSaver()
imageSaver.successHandler = {
saveAlertMessage = "Your image has been saved to the photo gallery."
showSaveAlert = true
showSettingsAlert = false
}
imageSaver.errorHandler = { error in
saveAlertMessage = "Failed to save image: \(error.localizedDescription)"
showSaveAlert = true
showSettingsAlert = false
}
imageSaver.saveImageToPhotoAlbum(image: image)
@unknown default:
saveAlertMessage = "An unknown error occurred."
showSaveAlert = true
showSettingsAlert = false
}
}
}
< /code>
import SwiftUI
struct CustomCameraView: View {
@StateObject var cameraService = CameraService()
@Binding var capturedImage: UIImage?
@Environment(\.presentationMode) private var presentationMode
var body: some View {
ZStack {
CamView(cameraService: cameraService) { result in
switch result {
case .success(let image):
capturedImage = image
presentationMode.wrappedValue.dismiss()
case .failure(let err):
print(err.localizedDescription)
}
}
.edgesIgnoringSafeArea(.all)
VStack {
HStack {
Spacer()
Button(action: {
cameraService.toggleFlash()
}) {
Image(systemName: cameraService.flashMode == .on ? "bolt.fill" : "bolt.slash.fill")
.font(.system(size: 20))
.foregroundColor(.white)
.padding()
.background(Color.black.opacity(0.6))
.clipShape(Circle())
}
.padding(.top, 40)
.padding(.trailing, 20)
}
Spacer()
GeometryReader { geometry in
ZStack {
Button(action: {
cameraService.capturePhoto()
}) {
Image(systemName: "circle")
.font(.system(size: 72))
.foregroundStyle(.white)
}
.position(x: geometry.size.width / 2, y: geometry.size.height - 100)
Button(action: {
cameraService.toggleCamera()
}) {
Image(systemName: "camera.rotate")
.font(.system(size: 24))
.padding()
.background(Color.white)
.foregroundColor(.black)
.clipShape(Circle())
}
.position(x: geometry.size.width - 50, y: geometry.size.height - 100)
}
}
.frame(height: 100)
}
.padding(.bottom, -40)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... ra-preview
Swiftui - захваченное изображение отличается от предварительного просмотра камеры ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Swiftui - захваченное изображение отличается от предварительного просмотра камеры
Anonymous » » в форуме IOS - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Соотношение сторон сохраненного видео отличается от виджета предварительного просмотра.
Anonymous » » в форуме Android - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему компоновка Compose на эмуляторе Android отличается от предварительного просмотра?
Anonymous » » в форуме Android - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-