gpt4 book ai didi

swift - 在 imagePicker 前面显示 View

转载 作者:行者123 更新时间:2023-11-30 11:30:06 24 4
gpt4 key购买 nike

在我的应用程序中,用户可以打开相机胶卷选择一张照片,也可以打开相机直接自己拍摄一张照片。

在这两种情况下,选择/拍摄的图片也将保存在本地以供进一步引用。

缺点是保存操作通常会卡住屏幕直到完成。

我找到了一个动画in this post我想将其显示在 imagePickerController 前面,但我无法做到这一点。

class SinglePageViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UINavigationBarDelegate {

var spinner: UIActivityIndicatorView?

lazy var showCameraImagePickerController: UIImagePickerController = {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = false
return imagePicker
}()

lazy var showPhotoImagePickerController: UIImagePickerController = {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = false
return imagePicker
}()

@IBOutlet weak var photoButton: UIButton!
@IBAction func onPhotoButton(_ sender: Any) {
self.present(self.showCameraImagePickerController, animated: true, completion: nil)
}

@IBOutlet weak var galleryButton: UIButton!
@IBAction func onGalleryButton(_ sender: Any) {
self.present(self.showPhotoImagePickerController, animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {

//start animation
let screenSize: CGRect = UIScreen.main.bounds

spinner = UIActivityIndicatorView(frame: CGRect(x: screenSize.width / 2 - 150, y: screenSize.height / 2 - 150, width: 300, height: 300))
spinner?.isHidden = false
spinner?.startAnimating()
spinner?.color = UIColor.red

switch picker {
case showCameraImagePickerController:
// snap pic, save to doc, save to album

self.showCameraImagePickerController.view.addSubview(spinner!)

timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false, block: { _ in

let image = info[UIImagePickerControllerOriginalImage] as? UIImage

if self.saveImage(imageName: "\(self.titleLabel.text!).png", image: image) {
// additionally save to photo album
UIImageWriteToSavedPhotosAlbum(image!, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)

print("saved \(self.titleLabel.text!).png")

self.imageView.image = image
}
})

case showPhotoImagePickerController:
//switch pic, save to doc. no album

self.showPhotoImagePickerController.view.addSubview(spinner!)

timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false, block: { _ in

let image = info[UIImagePickerControllerOriginalImage] as? UIImage

if self.saveImage(imageName: "\(self.titleLabel.text!).png", image: image) {

print("saved new \(self.titleLabel.text!).png")

self.imageView.image = image

self.spinner?.stopAnimating()
self.spinner?.removeFromSuperview()
self.spinner = nil

self.showPhotoImagePickerController.dismiss(animated: true, completion: nil)
} else {
self.spinner?.stopAnimating()
self.spinner?.removeFromSuperview()
self.spinner = nil

self.showPhotoImagePickerController.dismiss(animated: true, completion: nil)
}
})

default:
return
}

}

@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {

spinner?.stopAnimating()
spinner?.removeFromSuperview()
spinner = nil

self.showCameraImagePickerController.dismiss(animated: true, completion: nil)
}

func saveImage(imageName: String, image: UIImage?) -> Bool {

//create an instance of the FileManager
let fileManager = FileManager.default

//get the image path
let imagePath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(imgDir + imageName)
print(imagePath)

//get the image we took with camera
let image = rotateImage(image: image!)

//get the PNG data for this image
let data = UIImagePNGRepresentation(image)

//store it in the document directory
if fileManager.createFile(atPath: imagePath as String, contents: data, attributes: nil) {
newItem?.image = true

return true
} else {
print("error while saving")
return false
}
}
}

如您所见,我尝试使用 bringSubView(toFront:) 以及 zPosition 但没有结果。

正在关注this similar question我查看了 cameraOverlayView 的文档但它说它仅在 imagePicker 以相机模式呈现时才有效,这并不包括我打开照片库时的情况

我最近还尝试使用一种解决方法,这意味着我尽快关闭 imagePickerController 并随后更新图像,但由于应用程序结构发生了一些变化,这不再是最佳选择。

编辑

为了让自己更清楚,我将再次说明我需要什么:在 imagePicker 的前面显示旋转动画,只要我点击照片来选择它,直到我完成保存,然后关闭 imagePicker。我不想首先关闭选择器,然后在主视图中显示微调器时保存。

编辑2使用答案中的新代码更新了代码。唯一的问题是,如果我不设置计时器,微调器只会在保存过程结束时短暂显示自己(使用断点检查)。这会导致在保存过程的几秒钟内没有动画,并且在关闭 imagePicker 之前仅在最后出现短暂的旋转器幻影。只需放置 0.1 秒的延迟就会立即触发旋转器,我会得到预期的行为(保存时的动画)。不知道为什么

最佳答案

请查看完整的示例,其中在保存图像时将显示微调器,保存完成后微调器将被删除。

    class ViewController: UIViewController {

/// Image picker controller
lazy var imagePickerController: UIImagePickerController = {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary;
imagePicker.allowsEditing = false
return imagePicker
}()

var spinner: UIActivityIndicatorView?

@IBAction func imagePickerButton(_ sender: UIButton) {
self.present(self.imagePickerController, animated: true, completion: nil)
}
}

// MARK: ImagePicker Delegate to get the image picked by the user
extension ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//start animation
let screenSize: CGRect = UIScreen.main.bounds
spinner = UIActivityIndicatorView(frame: CGRect(x: screenSize.width/2 - 50, y: screenSize.height/2 - 50, width: 100, height: 100))
spinner?.isHidden = false
spinner?.startAnimating()
spinner?.color = UIColor.black
self.imagePickerController.view.addSubview(spinner!)

let image = info[UIImagePickerControllerOriginalImage] as? UIImage
UIImageWriteToSavedPhotosAlbum(image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)

}

@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {

spinner?.stopAnimating()
spinner?.removeFromSuperview()
spinner = nil

self.imagePickerController.dismiss(animated: true, completion: nil)

if error == nil {
let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
}

关于swift - 在 imagePicker 前面显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50343770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com