غرق در دنیای برنامه نویسی , برنامه نویس خندون و پر انرژی
انتخاب عکس از گالری در سوئیفت
مقدمه
امروز قرار هست توضیح بدهیم که چگونه عکس را از گالری بگیریم و آن را نمایش بدهیم .
شروع
با استفاده از سوئیفت ۵ این آموزش را کامل میکنیم
ابتدا یک پروژه ایجاد میکنیم و در آن یک 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 را بزنید و داخل دیکشنری کد بالا را پیست کنید
مطلبی دیگر از این انتشارات
توابع تو در تو یا nested function در سوئیفت
مطلبی دیگر از این انتشارات
آموزش ساخت Static Tableview در سوئیفت
مطلبی دیگر از این انتشارات
توابع Variadic در سوئیفت