จะอนุญาตให้ผู้ใช้เลือกภาพด้วย Swift ได้อย่างไร


89

ฉันกำลังเขียนแอปพลิเคชัน iOS ตัวแรก (iPhone เท่านั้น) ด้วย Swift มุมมองแอปพลิเคชันหลักควรอนุญาตให้ผู้ใช้เลือกภาพจากแกลเลอรีรูปภาพ

ฉันพบโค้ดตัวอย่างต่อไปนี้ของViewController.swift :

class ViewController: UIImagePickerController, UINavigationControllerDelegate, UIImagePickerControllerDelegate  {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

        var imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
        imagePickerController.allowsEditing = true
        self.presentViewController(imagePickerController, animated: true, completion: { imageP in

        })
    }


    func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
        let selectedImage : UIImage = image
        println(selectedImage)
    }

}

และมี View Controller Scene ดังต่อไปนี้ -

View Controller
 - Top Layout Guide
 - Bottom Layout Guide
 - View
   - Image View
First Responder
Exit

แต่เมื่อฉันเปิดแอปหน้าจอสีดำจะปรากฏขึ้น ฉันทำอะไรผิด? โค้ดตัวอย่างอื่นที่ฉันพบอยู่ใน Objective-C ซึ่งไม่ได้ช่วยฉัน


ปัญหาหนึ่งอาจเป็นได้ว่า didSselectRowAtIndePath คือการเรียกตัวแทนสำหรับ UITableViewDelegate ตามเลย์เอาต์ฉากและโค้ดของคุณจะไม่มีการใช้ tableview ที่นี่และ ViewController ของคุณไม่ใช่ UITableViewDelegate บางที start อาจเป็นโปรเจ็กต์เปล่าที่ใช้งานได้และเพิ่มปุ่มและเริ่มโค้ดของคุณจากการกดปุ่ม
Michael Wildermuth

@LA_ ฉันไม่เข้าใจว่าทำไมฟังก์ชัน tableView จึงเกี่ยวข้องที่นี่?
Dekel Maman

มันใช้งานได้และผ่านการทดสอบแล้วเพียงไปที่: stackoverflow.com/questions/41717115/…
Mr.Javed Multani

โปรดดูที่นี่theswiftdev.com/…
Andrews

คำตอบ:


132

หากคุณต้องการให้ผู้ใช้เลือกภาพด้วย UIImagePickerController ให้ใช้รหัสนี้:

import UIKit


class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet var imageView: UIImageView!
    @IBOutlet var chooseBuuton: UIButton!
    var imagePicker = UIImagePickerController()

    @IBAction func btnClicked() {

        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
            print("Button capture")

            imagePicker.delegate = self
            imagePicker.sourceType = .savedPhotosAlbum
            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)
        }
    }

    func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!){
        self.dismiss(animated: true, completion: { () -> Void in

        })

        imageView.image = image
    }
}

จะเกิดอะไรขึ้นหากฉันไม่ต้องการให้ผู้ใช้กดปุ่มเพื่อเลือกภาพ
LA_

ลบ @IBaction ออกจาก func และเรียก func เมื่อคุณต้องการให้พูดใน viewDidLoad หรือทุกเวลาที่คุณต้องการเพียงแค่เรียกมันว่า
Dekel Maman

ขอบคุณ. มันบอกว่าAttempt to present <UIImagePickerController: 0x7fdb84029800> on <MyApp.ViewController: 0x7fdb838360a0> whose view is not in the window hierarchy!. ฉันควรเพิ่มบางอย่างในฉากหรือไม่?
LA_

3
ฉันโหวต bc สิ่งนี้มีประโยชน์จริงๆ ต้องเปลี่ยน NSDictionary เป็น [NSObject: AnyObject] และใช้งานได้ดี!
scubasteve623

@DekelMaman มีการแนะนำการแก้ไขในคิวการตรวจสอบเพื่อให้เป็น Swift3 แต่มีคุณภาพไม่ดีดังนั้นฉันจึงปฏิเสธและทำการแก้ไขอย่างเหมาะสมเพื่อหลีกเลี่ยงคำแนะนำเพิ่มเติม
Cœur

80

ตัวเลือกรูปภาพที่ใช้งานคัดลอกวางที่สมบูรณ์สำหรับswift 4ตามคำตอบ @ user3182143:

import Foundation
import UIKit


class ImagePickerManager: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var picker = UIImagePickerController();
    var alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
    var viewController: UIViewController?
    var pickImageCallback : ((UIImage) -> ())?;
    
    override init(){
        super.init()
        let cameraAction = UIAlertAction(title: "Camera", style: .default){
            UIAlertAction in
            self.openCamera()
        }
        let galleryAction = UIAlertAction(title: "Gallery", style: .default){
            UIAlertAction in
            self.openGallery()
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel){
            UIAlertAction in
        }

        // Add the actions
        picker.delegate = self
        alert.addAction(cameraAction)
        alert.addAction(galleryAction)
        alert.addAction(cancelAction)
    }

    func pickImage(_ viewController: UIViewController, _ callback: @escaping ((UIImage) -> ())) {
        pickImageCallback = callback;
        self.viewController = viewController;

        alert.popoverPresentationController?.sourceView = self.viewController!.view

        viewController.present(alert, animated: true, completion: nil)
    }
    func openCamera(){
        alert.dismiss(animated: true, completion: nil)
        if(UIImagePickerController .isSourceTypeAvailable(.camera)){
            picker.sourceType = .camera
            self.viewController!.present(picker, animated: true, completion: nil)
        } else {
            let alertWarning = UIAlertView(title:"Warning", message: "You don't have camera", delegate:nil, cancelButtonTitle:"OK", otherButtonTitles:"")
            alertWarning.show()
        }
    }
    func openGallery(){
        alert.dismiss(animated: true, completion: nil)
        picker.sourceType = .photoLibrary
        self.viewController!.present(picker, animated: true, completion: nil)
    }

    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
    //for swift below 4.2
    //func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    //    picker.dismiss(animated: true, completion: nil)
    //    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    //    pickImageCallback?(image)
    //}
    
    // For Swift 4.2+
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true, completion: nil)
        guard let image = info[.originalImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
        pickImageCallback?(image)
    }



    @objc func imagePickerController(_ picker: UIImagePickerController, pickedImage: UIImage?) {
    }

}

เรียกใช้จากตัวควบคุมมุมมองของคุณดังนี้:

    ImagePickerManager().pickImage(self){ image in
        //here is the image
    }

อย่าลืมใส่คีย์ต่อไปนี้ในinfo.plist:

<key>NSCameraUsageDescription</key>
<string>This app requires access to the camera.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires access to the photo library.</string>

2
ต้องแทนที่ func imagePickerControllerด้วยสิ่งนี้เพื่อให้ทำงานได้ ขอบคุณ! func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage pickImageCallback?(image) picker.dismiss(animated: true, completion: nil) }
ตั้ม

2
'NSInternalInconsistencyException', เหตุผล: 'UIAlertController สามารถดำเนินการได้เพียงครั้งเดียวด้วยสไตล์ของ UIAlertActionStyleCancel' ฉันได้รับข้อผิดพลาดนี้พร้อมรหัสด้านบน
PaFi

ฉันเพิ่มรหัสต่อไปนี้เพื่อแก้ไขปัญหา: หาก alert.actions.count> 0 {// alert เรียกอีกครั้งหลังจากยกเลิก self.present (alert, animated: true, complete: nil)} else {alert.addAction (cameraAction) alert .addAction (galleryAction) alert.addAction (CancelAction) self.present (alert, animated: true, complete: nil)}
Ing. รอน

1
@ Ing.R บน addActions จะต้องตั้งค่าเพียงครั้งเดียวดังนั้นจึงควรนั่งในวิธีการเริ่มต้นแทน - ฉันอัปเดตโค้ดแล้ว โปรดแจ้งให้เราทราบหากคุณมีปัญหาใด ๆ เกี่ยวกับสิ่งนั้น
กับเรา

@vir us: ขอบคุณมากสำหรับการตอบกลับที่รวดเร็วของคุณ! ในกรณีของฉันฉันใส่รหัส init () ของคุณใน viewDidLoad () ซึ่งใช้ได้ดีสำหรับฉัน!
อิง. รอน

39

สำหรับ Swift 3:

  1. ขั้นแรกคุณต้องเพิ่มคีย์ต่อไปนี้ใน info.plist:

        <key>NSPhotoLibraryUsageDescription</key>
    <string>This app requires access to the photo library.</string>
    
  2. ตัวควบคุม View ของคุณต้องเป็นไปตามโปรโตคอลต่อไปนี้: UIImagePickerControllerDelegate, UINavigationControllerDelegate:

    class ImagePickerViewController:  UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate {}
    
  3. คุณต้องประกาศ UIImage ที่คุณจะใช้เพื่อผูกรูปภาพที่ส่งคืน / ที่เลือก:

    @IBOutlet weak var myImageView: UIImageView!
    @IBoutlet weak var upLoadImageBtn:UIImage!
    let imagePicker = UIImagePickerController()
    
  4. ตั้งค่าผู้รับมอบสิทธิ์ pickerImage ให้เป็น ViewController ของคุณ:

    imagePicker.delegate = self
    
  5. สำหรับปุ่มอัปโหลดคุณจะต้องลิงก์ไปยังรูปภาพต่อไปนี้เพื่อเริ่มการทำงานและแสดงตัวเลือกรูปภาพ:

    @IBAction func upLoadImageBtnPressed(_ sender: AnyObject) {
        imagePicker.allowsEditing = false
        imagePicker.sourceType = .photoLibrary
    
    
        /*
        The sourceType property wants a value of the enum named        UIImagePickerControllerSourceType, which gives 3 options:
    
        UIImagePickerControllerSourceType.PhotoLibrary
        UIImagePickerControllerSourceType.Camera
        UIImagePickerControllerSourceType.SavedPhotosAlbum
    
        */
        present(imagePicker, animated: true, completion: nil)
    
    }
    
  6. ตัวควบคุมมุมมองของคุณจำเป็นต้องใช้วิธีการมอบหมายสำหรับผู้รับมอบสิทธิ์ตัวเลือกรูปภาพ:

    // MARK: - ImagePicker Delegate
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            myImageView.contentMode = .scaleAspectFit
            myImageView.image = pickedImage
        }
    
    
        /*
    
        Swift Dictionary named “info”.  
        We have to unpack it from there with a key asking for what media information we want.
        We just want the image, so that is what we ask for.  For reference, the available options are:
    
        UIImagePickerControllerMediaType
        UIImagePickerControllerOriginalImage
        UIImagePickerControllerEditedImage
        UIImagePickerControllerCropRect
        UIImagePickerControllerMediaURL
        UIImagePickerControllerReferenceURL
        UIImagePickerControllerMediaMetadata
    
        */
        dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion:nil)
    }
    

13

ฉันจะให้การเข้ารหัสที่เข้าใจได้ดีที่สุดสำหรับการเลือกภาพอ้างอิงสิ่งนี้

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
{
     var alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
     var cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
     {
        UIAlertAction in
        self.openCamera()
     }
     var gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default)
     {
        UIAlertAction in
        self.openGallary()
     }
     var cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
     {
        UIAlertAction in
     }

    // Add the actions
     picker?.delegate = self
     alert.addAction(cameraAction)
     alert.addAction(gallaryAction)
     alert.addAction(cancelAction)
     self.presentViewController(alert, animated: true, completion: nil)
}
func openCamera()
{
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
    {
        picker!.sourceType = UIImagePickerControllerSourceType.Camera
        self .presentViewController(picker!, animated: true, completion: nil)
    }
    else
    {
        let alertWarning = UIAlertView(title:"Warning", message: "You don't have camera", delegate:nil, cancelButtonTitle:"OK", otherButtonTitles:"")
        alertWarning.show()
    }
}
func openGallary()
{
    picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    self.presentViewController(picker!, animated: true, completion: nil)
}

//PickerView Delegate Methods
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject])
{
    picker .dismissViewControllerAnimated(true, completion: nil)
    imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
}
func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
    println("picker cancel.")
}

ขอให้มีความสุขในวันนี้นะครับ :-)


8
    @IBAction func chooseProfilePicBtnClicked(sender: AnyObject) {
    let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
    let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openCamera()
    }
    let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertActionStyle.Default)
        {
            UIAlertAction in
            self.openGallary()
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
        {
            UIAlertAction in
    }

    // Add the actions
    picker.delegate = self
    alert.addAction(cameraAction)
    alert.addAction(gallaryAction)
    alert.addAction(cancelAction)
    self.presentViewController(alert, animated: true, completion: nil)
}
func openCamera(){
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){
        picker.sourceType = UIImagePickerControllerSourceType.Camera
        self .presentViewController(picker, animated: true, completion: nil)
    }else{
        let alert = UIAlertView()
        alert.title = "Warning"
        alert.message = "You don't have camera"
        alert.addButtonWithTitle("OK")
        alert.show()
    }
}
func openGallary(){
    picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    self.presentViewController(picker, animated: true, completion: nil)
}
//MARK:UIImagePickerControllerDelegate
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){
    picker .dismissViewControllerAnimated(true, completion: nil)
    imageViewRef.image=info[UIImagePickerControllerOriginalImage] as? UIImage
}
func imagePickerControllerDidCancel(picker: UIImagePickerController){
    print("picker cancel.")
}

7

ใน Swift 5 คุณต้องทำสิ่งนี้

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet var imageView: UIImageView!
    var imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func setPicture(_ sender: Any) {
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true, completion: nil)
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = image
        }

    }




}

5

XCODE 10.1 / SWIFT 4.2:

  1. เพิ่มสิทธิ์ที่จำเป็น (อื่น ๆ ที่กล่าวถึง)

  2. เพิ่มชั้นเรียนนี้ในมุมมองของคุณ:


    import UIKit

    import Photos

    import Foundation

class UploadImageViewController: UIViewController, UIImagePickerControllerDelegate , UINavigationControllerDelegate {

        @IBOutlet weak var imgView: UIImageView!

        let imagePicker = UIImagePickerController()

        override func viewDidLoad() {

            super.viewDidLoad()

            checkPermission()

            imagePicker.delegate = self
            imagePicker.allowsEditing = false
            imagePicker.sourceType = .photoLibrary
        }

        @IBAction func btnSetProfileImageClickedCamera(_ sender: UIButton) {
        }

        @IBAction func btnSetProfileImageClickedFromGallery(_ sender: UIButton) {
            self.selectPhotoFromGallery()
        }

        func selectPhotoFromGallery() {
            self.present(imagePicker, animated: true, completion: nil)
        }

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

            if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
                    self.imgView.contentMode = .scaleAspectFit
                    self.imgView.image = pickedImage
                }

            dismiss(animated: true, completion: nil)
        }


        func imagePickerControllerDidCancel(_ picker: UIImagePickerController){
            print("cancel is clicked")
        }


        func checkPermission() {
            let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
            switch photoAuthorizationStatus {
            case .authorized:
                print("Access is granted by user")
            case .notDetermined:
                PHPhotoLibrary.requestAuthorization({
                    (newStatus) in
                    print("status is \(newStatus)")
                    if newStatus ==  PHAuthorizationStatus.authorized {
                        /* do stuff here */
                        print("success")
                    }
                })
                print("It is not determined until now")
            case .restricted:
                // same same
                print("User do not have access to photo album.")
            case .denied:
                // same same
                print("User has denied the permission.")
            }
        }
    }

3

ทำสิ่งนี้เพื่อแสดงภาพไลบรารีรูปภาพการเข้ารหัสอย่างรวดเร็ว:

var pkcrviewUI = UIImagePickerController()
        if UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary)
        {
            pkcrviewUI.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
            pkcrviewUI.allowsEditing = true
            pkcrviewUI.delegate = self
            [self .presentViewController(pkcrviewUI, animated: true , completion: nil)]
        }

3

ฉันรู้ว่านี่เป็นคำถามที่มีอายุหนึ่งปี แต่นี่เป็นรหัสง่ายๆ (ส่วนใหญ่มาจากบทช่วยสอนนี้ ) ที่ใช้ได้ดีสำหรับฉัน:

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var imageView: UIImageView!

var imagePicker = UIImagePickerController()

override func viewDidLoad() {
    super.viewDidLoad()

    self.imagePicker.delegate = self
}

@IBAction func loadImageButtonTapped(sender: AnyObject) {
    print("hey!")
    self.imagePicker.allowsEditing = false
    self.imagePicker.sourceType = .SavedPhotosAlbum

    self.presentViewController(imagePicker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        self.imageView.contentMode = .ScaleAspectFit
        self.imageView.image = pickedImage
    }

    dismissViewControllerAnimated(true, completion: nil)

}

func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    self.imagePicker = UIImagePickerController()
    dismissViewControllerAnimated(true, completion: nil)
}

สามารถดูบทช่วยสอนในเชิงลึกมากกว่าที่ฉันอ้างถึงได้ที่นี่
Rachel Harvey

3

สำหรับ Swift 4
รหัสนี้ทำงานให้ฉัน !!

import UIKit


class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet var imageView: UIImageView!
    @IBOutlet var chooseBuuton: UIButton!
    var imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker.delegate = self
    }
    @IBAction func btnClicked() {

    if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) 
    {
        print("Button capture")
        imagePicker.sourceType = .savedPhotosAlbum;
        imagePicker.allowsEditing = false

        self.present(imagePicker, animated: true, completion: nil)
        }
    }

  @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    imageView.image = chosenImage

    dismiss(animated: true, completion: nil)
    }
}

2

แน่นอนคำตอบข้างต้นแก้ปัญหาหลักได้

ฉันประสบปัญหาใน Swift 3.0 ขณะเปิดตัวอัลบั้มรูปภาพเนื่องจาก Info.plist ไม่มีแฟล็กเหล่านี้:

  1. ความเป็นส่วนตัว - คำอธิบายการใช้งานคลังรูปภาพ -> NSPhotoLibraryUsageDescription

  2. ความเป็นส่วนตัว - คำอธิบายการใช้งานกล้อง -> NSCameraUsageDescription

[ภาพหน้าจอ [1]

โปรดเพิ่มหากคุณประสบปัญหาที่คล้ายกัน

ขอบคุณ!


1

นี่คือวิธีง่ายๆในการทำ:

แต่ก่อนอื่นคุณต้องเพิ่ม (Privacy - Photo Library Usage Description) ใน info.plist และคุณควรมีปุ่มและ UIImageView ใน viewController ของคุณ

จากนั้นสร้างทางออกของ UIImageView (ในรหัสนี้ร้านเรียกว่า myImage) และการทำงานของปุ่ม (ฉันเรียกว่าการนำเข้าการกระทำในรหัสของฉัน)

import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    @IBOutlet weak var myImage: UIImageView!
    @IBAction func importing(_ sender: Any) {
        let Picker = UIImagePickerController()
        Picker.delegate = self
        Picker.sourceType = .photoLibrary
        self.present(Picker, animated: true, completion: nil)
        Picker.allowsEditing = true
        Picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    }

     func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [String : Any])
    {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage //1
        myImage.contentMode = .scaleAspectFit //2
        myImage.image = chosenImage //3
        dismiss(animated:true, completion: nil) //4
    }

}

0

ในกรณีที่คุณไม่ต้องการมีปุ่มแยกต่างหากนี่เป็นอีกวิธีหนึ่ง แนบท่าทางสัมผัสบน imageView ซึ่งเมื่อแตะรูปภาพการแจ้งเตือนจะปรากฏขึ้นพร้อมสองตัวเลือก คุณจะมีตัวเลือกให้เลือกจากคลังภาพ / คลังรูปภาพหรือเพื่อยกเลิกการแจ้งเตือน

import UIKit
import CoreData

class AddDetailsViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var imageView: UIImageView!

var picker:UIImagePickerController? = UIImagePickerController()

@IBAction func saveButton(sender: AnyObject) {
    let managedContext = (UIApplication.sharedApplication().delegate as? AppDelegate)!.managedObjectContext

    let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext)

    let person = Person(entity: entity!, insertIntoManagedObjectContext: managedContext)

    person.image = UIImageJPEGRepresentation(imageView.image!, 1.0) //imageView.image

    do {
         try person.managedObjectContext?.save()
         //people.append(person)
       } catch let error as NSError {
         print("Could not save \(error)")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(AddDetailsViewController.tapGesture(_:)))
    imageView.addGestureRecognizer(tapGesture)
    imageView.userInteractionEnabled = true

    picker?.delegate = self
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func tapGesture(gesture: UIGestureRecognizer) {
    let alert:UIAlertController = UIAlertController(title: "Profile Picture Options", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

    let gallaryAction = UIAlertAction(title: "Open Gallary", style: UIAlertActionStyle.Default) {
        UIAlertAction in self.openGallary()
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) {
        UIAlertAction in self.cancel()
    }

    alert.addAction(gallaryAction)
    alert.addAction(cancelAction)

    self.presentViewController(alert, animated: true, completion: nil)

}


func openGallary() {
    picker!.allowsEditing = false
    picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    presentViewController(picker!, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imageView.contentMode = .ScaleAspectFit
        imageView.image = pickedImage
    }

    dismissViewControllerAnimated(true, completion: nil)
}

func cancel(){
    print("Cancel Clicked")
}

}

เพิ่มคำถามเพิ่มเติมให้ใช้ตรรกะในการจัดเก็บภาพใน CoreData


0

คลิกที่ปุ่มและเปิดแกลเลอรีรูปภาพและตั้งค่าภาพใน imageview swift 3.0

เพิ่มผู้แทนสาม UIImagePickerControllerDelegate, UIPopoverControllerDelegate, UINavigationControllerDelegate

var picker:UIImagePickerController?=UIImagePickerController()
@IBOutlet var imgPhoto: UIImageView!

   override func viewDidLoad() {
    super.viewDidLoad()
    picker?.delegate=self
   }

 @IBAction func btnAddPhotoClicked(_ sender: UIButton) {
    openGallary()
   }

func openGallary()
{
    picker!.allowsEditing = false
    picker!.sourceType = UIImagePickerControllerSourceType.photoLibrary
    present(picker!, animated: true, completion: nil)
}

//MARK:- ImagePicker Controller Delegate
//MARK:-

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

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imgPhoto.contentMode = .scaleToFill
        imgPhoto.image = chosenImage
    } else{
        print("Something went wrong")
    }

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

0

เพียงตอบที่นี่เพื่อพูดถึง: info[UIImagePickerControllerEditedImage]อาจเป็นสิ่งที่คุณต้องการใช้ในกรณีส่วนใหญ่

นอกเหนือจากนั้นคำตอบที่นี่ยังครอบคลุม


0

ลองอันนี้มันง่ายมาก .. ในการ Pic a Image โดยใช้UIImagePickerControllerDelegate

    @objc func masterAction(_ sender: UIButton)
    {
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
            print("Button capture")

            imagePicker.delegate = self
            imagePicker.sourceType = .savedPhotosAlbum;
            imagePicker.allowsEditing = false

            self.present(imagePicker, animated: true, completion: nil)
        }

        print("hello i'm touch \(sender.tag)")
    }

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

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            print("Get Image \(chosenImage)")
            ImageList.insert(chosenImage, at: 0)
            ArrayList.insert("", at: 0)
            Collection_Vw.reloadData()
        } else{
            print("Something went wrong")
        }

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

0

หากคุณต้องการเลือกเฉพาะภาพปกติที่คุณสามารถใช้รหัสด้านล่างให้ตรวจสอบว่าภาพที่เลือกไม่ใช่ภาพพาโนรามา

let picker = UIImagePickerController()

func photoFromLibrary() {

        self.picker.allowsEditing = true
        self.picker.sourceType = .photoLibrary
        //picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!

        self.present(self.picker, animated: true, completion: nil)

}

func shootPhoto() {

            if UIImagePickerController.isSourceTypeAvailable(.camera) {
                self.picker.allowsEditing = true
                self.picker.sourceType = UIImagePickerControllerSourceType.camera
                self.picker.cameraCaptureMode = .photo
                self.picker.modalPresentationStyle = .fullScreen
                self.present(self.picker,animated: true,completion: nil)
            }

}

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

    let str = "\(info["UIImagePickerControllerOriginalImage"]!)"

    let s = str.slice(from: "{", to: "}")

    if let arr = s?.components(separatedBy: ","){
        if arr.count >= 2 {
            if Int(arr[0])! > 11000 {
                picker.dismiss(animated:true, completion: nil)
                self.makeToast("Invalid Image!!!")
                return
            }
                     }
        }
    }

    if  let image = info[UIImagePickerControllerOriginalImage] as? UIImage{
        self.UserImageView.image = image
    }
    picker.dismiss(animated:true, completion: nil)
}


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

0

Xcode 10, Swift 4.2

ด้านล่างนี้เป็นเวอร์ชันที่ปรับให้เหมาะสมเล็กน้อยของการใช้งาน นี่อยู่ใน Swift 4.2 และฉันได้ทดสอบด้วย

คุณสามารถดูรหัสทั้งหมดสำหรับ ViewController ได้ที่นี่ โปรดทราบว่าคุณต้องกำหนด IBOutlet (imageView) และ IBAction (didTapOnChooseImageButton) ที่กำหนดและเชื่อมต่อในสตอรีบอร์ดด้วย หวังว่านี่จะช่วยได้

import UIKit

class ImagePickViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

var imagePicker = UIImagePickerController()
@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

@IBAction func didTapOnChooseImageButton(_ sender: Any) {
    let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertController.Style.actionSheet)
    let cameraAction = UIAlertAction(title: "Camera", style: UIAlertAction.Style.default) {
        UIAlertAction in
        self.openCamera(UIImagePickerController.SourceType.camera)
    }
    let gallaryAction = UIAlertAction(title: "Gallary", style: UIAlertAction.Style.default) {
        UIAlertAction in
        self.openCamera(UIImagePickerController.SourceType.photoLibrary)
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) {
        UIAlertAction in
    }

    // Add the actions
    imagePicker.delegate = self as UIImagePickerControllerDelegate & UINavigationControllerDelegate
    alert.addAction(cameraAction)
    alert.addAction(gallaryAction)
    alert.addAction(cancelAction)
    self.present(alert, animated: true, completion: nil)
}

func openCamera(_ sourceType: UIImagePickerController.SourceType) {
    imagePicker.sourceType = sourceType
    self.present(imagePicker, animated: true, completion: nil)
}

//MARK:UIImagePickerControllerDelegate

func imagePickerController(_ picker: UIImagePickerController,
                                    didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    imageView.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
    imagePicker.dismiss(animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    print("imagePickerController cancel")
}

}

ยินดีต้อนรับสู่ SO Nish! คำตอบแบบใช้รหัสเท่านั้นไม่ได้รับการสนับสนุนที่นี่เนื่องจากไม่ได้ให้ข้อมูลเชิงลึกว่าปัญหาได้รับการแก้ไขอย่างไร โปรดอัปเดตคำตอบของคุณเพื่อให้มีคำอธิบายว่าโค้ดของคุณแก้ปัญหาได้อย่างไร :)
Joel

ชื่นชมมาก @Joel ฉันได้อัปเดตคำตอบตามคำแนะนำของคุณแล้ว
Nish

0

คุณสามารถทำเช่นที่นี่

var avatarImageView = UIImageView()
var imagePicker = UIImagePickerController()
        
func takePhotoFromGallery() {
    imagePicker.delegate = self
    imagePicker.sourceType = .savedPhotosAlbum
    imagePicker.allowsEditing = true
    
    present(imagePicker, animated: true)
}

func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let pickedImage = info[.originalImage] as? UIImage {
        avatarImageView.contentMode = .scaleAspectFill
        avatarImageView.image = pickedImage
    }
    self.dismiss(animated: true)
}

หวังว่านี่จะเป็นประโยชน์


-1

สำหรับ Swift 3.4.1 รหัสนี้ใช้งานได้:

implements                                                             
class AddAdvertisementViewController : UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIActionSheetDelegate  

var imagePicker = UIImagePickerController()                                
var file :UIImage!

 //action sheet tap on image

 func tapOnButton(){   
    let optionMenu = UIAlertController(title: nil, message: "Add Photo", preferredStyle: .actionSheet)

    let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler:{
        (alert: UIAlertAction!) -> Void in
        self.addImageOnTapped()
    })

    let cameraAction = UIAlertAction(title: "Camera", style: .default, handler:{
        (alert: UIAlertAction!) -> Void in
        self.openCameraButton()
    })

    let cancleAction = UIAlertAction(title: "Cancel", style: .cancel, handler:{
        (alert: UIAlertAction!) -> Void in
        print("Cancel")
    })

    optionMenu.addAction(galleryAction)
    optionMenu.addAction(cameraAction)
    optionMenu.addAction(cancleAction)
    self.present(optionMenu, animated: true, completion: nil)
}


func openCameraButton(){
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
    {
        imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera;
        imagePicker.allowsEditing = true
        self.present(imagePicker, animated: true, completion: nil)
    }
}


func addImageOnTapped(){
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary;
        imagePicker.allowsEditing = true
        self.present(imagePicker, animated: true, completion: nil)
    }
}

//picker pick image and store value imageview
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
            file = image
            imgViewOne.image = image
        imagePicker.dismiss(animated: true, completion: nil);
    }
}

-1
@IBAction func ImportImage(_ sender: Any)
{
    let image = UIImagePickerController()
    image.delegate = self

    image.sourceType = UIImagePickerController.SourceType.photoLibrary

    image.allowsEditing = false

    self.present(image, animated: true)
    {
        //After it is complete
    }


}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
    {
        myimage.image = image
    }
    else{
        //
    }
    self.dismiss(animated: true, completion: nil)

    do {
        try context.save()
    } catch {
        print("Could not save. \(error), \(error.localizedDescription)")
    }

}

เพิ่มUINavigationControllerDelegate, UIImagePickerControllerDelegateผู้ได้รับมอบหมายในการกำหนดชั้น


เพิ่มความคิดเห็นอธิบายคำตอบของคุณอ่านวิธีการที่จะตอบ
Aksen P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.