SWIFT |照片库打不开
SWIFT | photo gallery not opening
我创建了一个应用程序菜单,用户可以在其中单击照片,照片会显示在 alertView 中,并且我添加了 2 个操作 -> 其中一个操作正在取消,其他操作正在编辑应该打开画廊的图像 select 一些其他图像。但是,当我单击编辑按钮(已添加代码)时,它什么都不做,与关闭警报视图的工作方式相同。
ALERTVIEW 的代码是
@objc func taxImageTApped(_snder:UITapGestureRecognizer) {
print("TaxImage")
let alertView = UIAlertController(title: "Edit Tax Image", message: "", preferredStyle: UIAlertController.Style.alert)
let image = #imageLiteral(resourceName: "backimg@3x.png")
let uiImageAlertAction = UIAlertAction(title: "", style: .default, handler: nil)
let scaleSze = CGSize(width: 245, height: 245/image.size.width*image.size.height)
let reSizedImage = image//.resize(newSize: scaleSze)
uiImageAlertAction.setValue(reSizedImage.withRenderingMode(.alwaysOriginal), forKey: "image")
alertView.addAction(uiImageAlertAction)
alertView.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.default, handler: nil))
alertView.addAction(UIAlertAction(title: "Edit", style: .default) {action in
let newImage = UIImagePickerController()
newImage.delegate = self
newImage.sourceType = UIImagePickerController.SourceType.photoLibrary
newImage.allowsEditing = false
})
self.present(alertView, animated: true, completion: nil)
}
/////////////////////below is details for tap gesture i have applied on //the label
taxImageView.translatesAutoresizingMaskIntoConstraints = false
taxImageView.textColor = tableTextColor
taxImageView.text = "View Image"
taxImageView.textAlignment = .left
taxImageView.attributedText = NSAttributedString(string: "View Image", attributes:
[.underlineStyle: NSUnderlineStyle.single.rawValue])
editInfoView.addSubview(taxImageView)
taxImageView.leftAnchor.constraint(equalTo: editInfoView.leftAnchor, constant: 260).isActive = true
taxImageView.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 740).isActive = true
taxImageView.widthAnchor.constraint(equalToConstant: 300).isActive = true
taxImageView.heightAnchor.constraint(equalToConstant: 20).isActive = true
taxImageView.isUserInteractionEnabled = true
let taxImageGesture = UITapGestureRecognizer.init(target: self, action: #selector(taxImageTApped))
taxImageGesture.numberOfTapsRequired = 1
taxImageGesture.isEnabled = true
taxImageGesture.cancelsTouchesInView = false
taxImageView.gestureRecognizerShouldBegin(taxImageGesture)
taxImageView.addGestureRecognizer(taxImageGesture)
试试这个
在控制器中创建变量
let imagePickerController = UIImagePickerController()
在viewDidLoad中添加这个
override func viewDidLoad() {
super.viewDidLoad()
imagePickerController.delegate = self
imagePickerController.allowsEditing = true
imagePickerController.modalPresentationStyle = .popover
}
从你想要的地方调用这个函数,或者你也可以添加为手势方法
func addActionSheet() {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
let galleryOption = UIAlertAction(title: "Choose Photo", style: .default, handler: { action in
self.imagePickerController.sourceType = .photoLibrary
self.present(self.imagePickerController, animated: true, completion: nil)
})
let cameraOption = UIAlertAction(title: "Take Photo", style: .default, handler: { action in
self.imagePickerController.sourceType = .camera
self.present(self.imagePickerController, animated: true, completion: nil)
})
let deleteOption = UIAlertAction(title: "Delete Photo", style: .default, handler: { action in
self.imageView.image = nil
})
let cancelOption = UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
self.dismiss(animated: true, completion: nil)
})
alertController.addAction(galleryOption)
alertController.addAction(cameraOption)
alertController.addAction(deleteOption)
alertController.addAction(cancelOption)
self.present(alertController, animated: true, completion: nil)
}
添加UIImagePickerControllerDelegate
或UINavigationControllerDelegate
的Delegate方法获取图片
extension ControllerName: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
self.imageView.image = image
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
}
为相机和图库创建 NSObject class。
import UIKit
class CameraHandler: NSObject{
//MARK:- Shared Instance
static let shared = CameraHandler()
private override init() {
}
//MARK:- Variables
var currentVC: UIViewController!
//MARK: Internal Properties
var imagePickedBlock: ((UIImage) -> Void)?
//MARK:- Open Camera
func camera() {
if UIImagePickerController.isSourceTypeAvailable(.camera){
UINavigationBar.appearance().barTintColor = UIColor.black
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .camera
currentVC.present(myPickerController, animated: true, completion: nil)
}
}
//MARK:- Open Gallery
func photoLibrary() {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
UINavigationBar.appearance().barTintColor = UIColor.black
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .photoLibrary
currentVC.present(myPickerController, animated: true, completion: nil)
}
}
//MARK:- ActionSheet For Options
func showActionSheet(vc: UIViewController) {
currentVC = vc
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.camera()
}))
actionSheet.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.photoLibrary()
}))
actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
vc.present(actionSheet, animated: true, completion: nil)
}
}
//MARK:- UIImagePickerController Delegate Methods
extension CameraHandler: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
UINavigationBar.appearance().barTintColor = UIColor.white
currentVC.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
UINavigationBar.appearance().barTintColor = UIColor.white
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
self.imagePickedBlock?(image)
}else{
print("Something went wrong")
}
currentVC.dismiss(animated: true, completion: nil)
}
}
在您的视图控制器中使用以下代码:
用于在当前视图控制器中显示警报:
CameraHandler.shared.showActionSheet(vc: self)
获取选中图片:
CameraHandler.shared.currentVC = self
CameraHandler.shared.imagePickedBlock = {(image) in
print(image)
}
@objc func taxImageTApped(_snder:UITapGestureRecognizer) {
print("TaxImage")
let alertView = UIAlertController(title: "Edit Tax Image", message: "", preferredStyle: UIAlertController.Style.alert)
let image = #imageLiteral(resourceName: "backimg@3x.png")
let uiImageAlertAction = UIAlertAction(title: "", style: .default, handler: nil)
let scaleSze = CGSize(width: 245, height: 245/image.size.width*image.size.height)
let reSizedImage = image//.resize(newSize: scaleSze)
uiImageAlertAction.setValue(reSizedImage.withRenderingMode(.alwaysOriginal), forKey: "image")
alertView.addAction(uiImageAlertAction)
alertView.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.default, handler: nil))
alertView.addAction(UIAlertAction(title: "Edit", style: .default) {action in
let newImage = UIImagePickerController()
newImage.delegate = self
newImage.sourceType = UIImagePickerController.SourceType.photoLibrary
newImage.allowsEditing = false
})
self.present(alertView, animated: true, completion: nil)
}
/////////////////////below is details for tap gesture i have applied on //the label
taxImageView.translatesAutoresizingMaskIntoConstraints = false
taxImageView.textColor = tableTextColor
taxImageView.text = "View Image"
taxImageView.textAlignment = .left
taxImageView.attributedText = NSAttributedString(string: "View Image", attributes:
[.underlineStyle: NSUnderlineStyle.single.rawValue])
editInfoView.addSubview(taxImageView)
taxImageView.leftAnchor.constraint(equalTo: editInfoView.leftAnchor, constant: 260).isActive = true
taxImageView.topAnchor.constraint(equalTo: editInfoView.topAnchor, constant: 740).isActive = true
taxImageView.widthAnchor.constraint(equalToConstant: 300).isActive = true
taxImageView.heightAnchor.constraint(equalToConstant: 20).isActive = true
taxImageView.isUserInteractionEnabled = true
let taxImageGesture = UITapGestureRecognizer.init(target: self, action: #selector(taxImageTApped))
taxImageGesture.numberOfTapsRequired = 1
taxImageGesture.isEnabled = true
taxImageGesture.cancelsTouchesInView = false
taxImageView.gestureRecognizerShouldBegin(taxImageGesture)
taxImageView.addGestureRecognizer(taxImageGesture)
试试这个
在控制器中创建变量
let imagePickerController = UIImagePickerController()
在viewDidLoad中添加这个
override func viewDidLoad() {
super.viewDidLoad()
imagePickerController.delegate = self
imagePickerController.allowsEditing = true
imagePickerController.modalPresentationStyle = .popover
}
从你想要的地方调用这个函数,或者你也可以添加为手势方法
func addActionSheet() {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
let galleryOption = UIAlertAction(title: "Choose Photo", style: .default, handler: { action in
self.imagePickerController.sourceType = .photoLibrary
self.present(self.imagePickerController, animated: true, completion: nil)
})
let cameraOption = UIAlertAction(title: "Take Photo", style: .default, handler: { action in
self.imagePickerController.sourceType = .camera
self.present(self.imagePickerController, animated: true, completion: nil)
})
let deleteOption = UIAlertAction(title: "Delete Photo", style: .default, handler: { action in
self.imageView.image = nil
})
let cancelOption = UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
self.dismiss(animated: true, completion: nil)
})
alertController.addAction(galleryOption)
alertController.addAction(cameraOption)
alertController.addAction(deleteOption)
alertController.addAction(cancelOption)
self.present(alertController, animated: true, completion: nil)
}
添加UIImagePickerControllerDelegate
或UINavigationControllerDelegate
的Delegate方法获取图片
extension ControllerName: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
self.imageView.image = image
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
}
为相机和图库创建 NSObject class。
import UIKit
class CameraHandler: NSObject{
//MARK:- Shared Instance
static let shared = CameraHandler()
private override init() {
}
//MARK:- Variables
var currentVC: UIViewController!
//MARK: Internal Properties
var imagePickedBlock: ((UIImage) -> Void)?
//MARK:- Open Camera
func camera() {
if UIImagePickerController.isSourceTypeAvailable(.camera){
UINavigationBar.appearance().barTintColor = UIColor.black
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .camera
currentVC.present(myPickerController, animated: true, completion: nil)
}
}
//MARK:- Open Gallery
func photoLibrary() {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
UINavigationBar.appearance().barTintColor = UIColor.black
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = .photoLibrary
currentVC.present(myPickerController, animated: true, completion: nil)
}
}
//MARK:- ActionSheet For Options
func showActionSheet(vc: UIViewController) {
currentVC = vc
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.camera()
}))
actionSheet.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { (alert:UIAlertAction!) -> Void in
self.photoLibrary()
}))
actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
vc.present(actionSheet, animated: true, completion: nil)
}
}
//MARK:- UIImagePickerController Delegate Methods
extension CameraHandler: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
UINavigationBar.appearance().barTintColor = UIColor.white
currentVC.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
UINavigationBar.appearance().barTintColor = UIColor.white
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
self.imagePickedBlock?(image)
}else{
print("Something went wrong")
}
currentVC.dismiss(animated: true, completion: nil)
}
}
在您的视图控制器中使用以下代码:
用于在当前视图控制器中显示警报:
CameraHandler.shared.showActionSheet(vc: self)
获取选中图片:
CameraHandler.shared.currentVC = self
CameraHandler.shared.imagePickedBlock = {(image) in
print(image)
}