本节课讲解了模态视图,文本框,UImagePickerController的相关知识,并延续了上一节课的Demo,添加了照相并存储照片的功能。
模态视图
模态视图不同于左右滑入的视图,它是从下往上,覆盖整个屏幕的视图。每次滑入都会重新新建一个控制器。通常用于修改信息等操作。
显示模态视图:
1 | [self presentViewController:(nonnull UIViewController *) animated:(BOOL) completion:^{}]; |
让模态视图消失:1
- (void)dissmissViewControllerAnimated:(BOOL)animated completion:(void(^))block;
注意:该消息是发送给present该模态视图的控制器,而不是该模态视图本身。因此,调用方法应该是:
1 | [self.presentingViewController dissmissViewControllerAnimated:YES ...]; |
UITextField
UITextField是文本框,可以用来输入文字,类似于UILabel。
让键盘出现和消失:
1 | [textField becomeFirstResponder]; |
代理方法:
1. 当点击了确定按键,让键盘消失
1 | - (BOOL)textFieldShouldReturn:(UITextField *)textField |
2. 当resignFirstResponder完成后执行:
1 | - (void)textFieldDidEndEditing:(UITextField *)textField; |
3. 内容发生变化时收到通知:
注册这个广播,就可以收到该通知:1
UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;
4. 键盘
设置键盘的类型需要通过给实现UITextInputTraits
的协议方法,通常是UITextField
1 | @protocol UITextInputTraits <NSObject> |
5. 监听键盘的高度:
通过注册UIKeyboard{will,did} {show hide}
广播来计算键盘弹出后的高度。
Alert
Alert是用来提醒用户某些消息的控件,它会出现在屏幕的正中央。我们可以自定义它的显示消息和按钮。也可以设定点击某个按钮执行的操作。
初始化:
1 | - (instancetype)initWithTitle:(nullable NSString *)title delegate:(nullable id<UIActionSheetDelegate>)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION NS_EXTENSION_UNAVAILABLE_IOS("Use UIAlertController instead."); |
增加按钮
1 | - (NSInteger)addButtonWithTitle:(nullable NSString *)title; |
显示在屏幕上:
1 | - (void)showFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated NS_AVAILABLE_IOS(3_2); |
处理点击事件:
1 | - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex NS_DEPRECATED_IOS(2_0, 8_3) __TVOS_PROHIBITED; // after animation |
手动让其消失
1 | - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated; |
UImagePickerController
UImagePickerController是用来选取图片,视频资源的控制器,也可以进行拍照。
使用步骤:
- alloc/init, set delegate
- 配置摄像头,照片库,用户是否可以编辑相片
- 显示
- 实现代理方法,获取媒体
检查硬件设备:
1 | + (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType; |
检查是否可以摄像:
1 | + (nullable NSArray<NSString *> *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; |
返回的数组是否有相应的字段:
kUTTypeImage
kUTTypeMovie
允许用户编辑(裁剪):
1 | @property BOOL allowEditing; |
获取了媒体(照片)后的代理方法
1 | - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info; |
点击了取消后的代理方法:
1 | - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker |
Demo
Demo需求:
- 在原摄影师列表的第一行添加“我的照片”。
- 点击“我的照片”后,显示地图上“我”所照照片的地点。
- 点击大头针,显示相应照片详情。
- 在导航栏右上角显示照相机按钮。
- 点击照相机按钮,从底部弹出添加照片的页面。
- 点击“Take Photo”,启动相机,照相并可以裁剪。
- 裁剪后,回到添加剂照片的页面。设置标题和副标题后,保存照片。
- 回到地图页面,自动添加刚才所增加照片的大头针。
Demo效果图
重要知识点和代码段
1. 在添加照片页面显示后判断是否可以拍照
1 |
|
2. CLLocationManager的初始化和使用
1 | - (CLLocationManager *)locationManager |
3. UIImagePickerController的初始化和使用
1 |
|
4. 判断是否执行某个Segue的Identifier
1 | - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender |
在添加照片后,我们需要将该页面取消并储存相应的数据。但由于业务需求,如果想要储存数据的前提下取消页面的话,那么就需要在取消页面之前来判断当前的数据是否满足储存的条件:是否有照片;是否设置了标题;是否获取了位置信息等。
5. 确定页面可以被取消后,在页面被取消前储存数据:
1 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender |
6. 获取新增图片的本地路径
1 | /** |
在这里,我们用当前的时间来拼接Document路径,获得了图片的唯一地址。
笔者今天在公司附近拍了一张照片来验证效果:一张南京东路苹果旗舰店的照片,不过定位比较不准。可能是由于周围高楼比较多,而且定位时间不够长的关系。
最后的话
如果哪位小伙伴想拿到本文Demo的代码请不要客气,可以进入我的GitHub下载哦~ 这一系列到现在为止的所有Demo都在里面,分为英文注释版本和中文注释版本两种。
如果嫌麻烦的童鞋可以在留言留下邮箱,笔者会将Demo包发给你~
十分欢迎给笔者的代码和文笔抛出宝贵的意见和建议~
本文为笔者原创,如需转载,请事先与笔者交涉~
————————————————- 2018年7月17日更新 ————————————————-
注意注意!!!
笔者在近期开通了个人公众号,主要分享编程,读书笔记,思考类的文章。
- 编程类文章:包括笔者以前发布的精选技术文章,以及后续发布的技术文章(以原创为主),并且逐渐脱离 iOS 的内容,将侧重点会转移到提高编程能力的方向上。
- 读书笔记类文章:分享编程类,思考类,心理类,职场类书籍的读书笔记。
- 思考类文章:分享笔者平时在技术上,生活上的思考。
因为公众号每天发布的消息数有限制,所以到目前为止还没有将所有过去的精选文章都发布在公众号上,后续会逐步发布的。
而且因为各大博客平台的各种限制,后面还会在公众号上发布一些短小精干,以小见大的干货文章哦~
扫下方的公众号二维码并点击关注,期待与您的共同成长~