انتخاب عکس از گالری در سوئیفت

مقدمه

امروز قرار هست توضیح بدهیم که چگونه عکس را از گالری بگیریم و آن را نمایش بدهیم .


شروع

با استفاده از سوئیفت ۵ این آموزش را کامل میکنیم

ابتدا یک پروژه ایجاد میکنیم و در آن یک UIImage و یک دکمه قرار میدهیم ، کار به اینصورت هست که با استفاده از دکمه به صفحه گالری میرویم و پس از انتخاب ، عکس را در UIImageView قرار میدهیم . در نهایت المنت ها را به کد متصل میکنیم

تصویر نهایی این قسمت به صورت زیر میباشد .

کمی کد بزنیم ?

دو پروتوکل UIImagePickerControllerDelegate , UINavigationControllerDelegate را confirm میکنیم

یک Instance از کلاس UIImagePickerController میسازیم

let imagePicker = UIImagePickerController()

در داخل بدنه دکمه گالری کد زیر را مینویسیم

self.picker.delegate = self
self.picker.sourceType = .photoLibrary
self.present(picker, animated: true, completion: nil)

در خط اول باید بگویید به picker که در کدام صفحه گالری را نشان دهد (البته این توضیح کاملی در مورد Delegate نیست و بعدا آن را مفصلا در مقاله ای دیگر توضیح خواهم داد )

خط دوم sourceType در واقع یک enum میباشد که سه حالت photo library , saved photo album,camera را دارد

  • savedPhotoAlbum : فقط البوم اصلی گالری را نشان میدهد
  • photolibrary : تمام البوم های موجود در گالری را نشان میدهد
  • camera : به دوربین متصل میشود

منظور از البوم اصلی Camera Roll هستش

در خط سوم هم با استفاده از present کلاس UIImagePickerController را نشان میدهیم (در مقاله های قبلی هم گفته ام معمولا کلاس هایی که به Controller ختم میشوند باید present شوند مثل UIAlertController)


ما اگر روی عکسی کلیک کنیم عملا هیچ اتفاقی نمی افتد چون تعریف نکرده ایم که چه بشود

متود didFinishPickingMediaWithInfo را که داخل پروتوکل UIImagePickerControllerDelegate هست را صدا میزنیم ، ما از این متود زمانی استفاده منیم که یک مدیا از گالری انتخاب شده و بعد از آن با آن عملیاتی انجام دهیم

میبینید که در این متود info یک دیکشنری میباشد که key آن از جنس UIImagePickerController.InfoKey میباشد و Value آن از جنس ‌Any است

حالا داخل بدنه این متود کد زیر را مینویسیم

if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
self.imageV.image = originalImage
}
dismiss(animated: true, completion: nil)

در خط اول ابتدا با استفاده از همان دیکشنری info کلید UIImagePickerController.InfoKey.originalImage را وارد میکنیم این کلید در واقع اورجینال عکس انتخاب شده را میدهد ، مثلا شما اگر اجازه crop بدهید و کاربر عکس را . crop کند با این کلید بازهم عکس اوریجینال به شما برمیگرداند

کلید های دیگر

سپس آن را به عکس cast میکنیم

شاید برای شما سوال باشد که if let چیست ما از if let زمانی استفاده میکنیم مطمئن شویم که مقدار آن متغیر هیچ وقت nil نمیشود

چه به درد میخوره ؟

در همین مثال ممکن است مدیا ای که ما انتخاب میکنیم نتواند به UIImage تبدیل شود در اینصورت به ما nil برمیگرداند و اپ ما کرش میکند ، پس سعی کنید در مواقع اینچنین حتما از nil نبودن مطمئن شوید


در آخر گالری را dismis میکنیم به این معنی که صفحه گالری کنار برود به صفحه ی اصلی برگردد

نکته مهم : حتما در plist این کلید ها را وارد کنید ، این برای اجازه دسترسی به گالری و دوربین است

<key>NSCameraUsageDescription</key>
<string>This app wants to take pictures.</string><key>NSPhotoLibraryUsageDescription</key>
<string>This app wants to use your photos.</string>


برای اضافه کردن به plist روی آن کلیک راست کنید و گزینه open as source code را بزنید و داخل دیکشنری کد بالا را پیست کنید

پروژه نهایی را از گیتهاب دریافت کنید

https://github.com/sadeghgoo/imagepicker

پایان