UIImageView - BNR
继续上节UINavigationController - BNR。
打开BNRDetailViewController.xib文件,向view中添加UIImageView对象,选中该对象,通过Attributes Inspector -> View -> Mode -> Aspect Fit,调整UIImageView对象的contentMode属性。
同时,添加UIToolBar拖到view的底部。选中UIToolBar的Item,通过Attributes Inspector -> Bar Button Item -> System Item -> Camera,将其改为相机图标。此相机按钮需要一个target和action。如下所示:

在BNRDetailViewController.m的类扩展中与UIImageView建立outlet连接,如下:

选择相机按钮,Control-Drag到BNRDetailViewController.m,创建takePicture:方法,如下:

同时,将UIToolBar建立一个outlet,取名为toolBar。
当我们创建了一个UIImagePickerController对象时,必须设置它的sourceType属性和给它分配一个delegate。
sourceType常量告诉UIImagePicker对象从哪里获取照片。其有三个可选的值,1)UIImagePickerControllerSourceTypeCamera,拍摄一张新的照片,使用该常量前,需要将isSourceTypeAvailable:方法发送给UIImagePickerController,检验该设备是否有相机功能;2)UIImagePickerControllerSourceTypePhotoLibrary,将选择一个照片集,从该照片集中选择照片;3)UIImagePickerControllerSourceTypeSavedPhotoAlbum,将从最近拍摄的照片中获取。
在BNRDetailViewController.m中,添加协议:
@interface BNRDetailViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
在BNRDetailViewController.m中,修改takePicture:方法如下:
- (IBAction)takePicture:(id)sender {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
imagePicker.delegate = self;
[self presentViewController:imagePicker animated:YES completion:nil];
}
UIImagePickerController对象已模态方式呈现。一个模态视图控制器将占据整个屏幕直到结束操作。
当用户已经选好一张照片时,imagePickerController:didFinishPickingMediaWithInfo:方法给被自动发送给UIImagePicker的委托对象。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
// 从info字典中获取选择的image
UIImage *image = info[UIImagePickerControllerOriginalImage];
self.imageVeiw.image = image;
// 退出UIImagePickerController
[self dismissViewControllerAnimated:YES completion:nil];
}
将照片存入disk中,当需要它们的时候才放到RAM中。
创建一个新的NSObject的子类BNRImageStore,其将持有用户使用的照片,其为单例模式。因为图像一般都比较大,将它们与其它数据分离开比较少。
打开BNRImageStore.h,添加如下方法:
#import <UIKit/UIKit.h> //此处将Foundation/Foundation.h修改为UIKit/UIKit.h @interface BNRImageStore : NSObject + (instancetype)sharedImage; - (void)setImage:(UIImage *)image forKey:(NSString *)key;
- (UIImage *)imageForKey:(NSString *)key;
- (void)deleteImageForKey:(NSString *)key; @end
打开BNRImageStore.m文件,添加类扩展,并声明一个变量,如下:
@interface BNRImageStore () @property (nonatomic, strong) NSMutableArray *dictionary; // 存放图片 @end
再添加下面的代码:
+ (instancetype)sharedImage {
static BNRImageStore *shareStore = nil;
if (!shareStore) {
shareStore = [[BNRImageStore alloc] initPrivate];
}
return shareStore;
}
- (instancetype)init {
@throw [NSException exceptionWithName:@"Singleton"
reason:@"Use+[BNRImageStore sharedStore]"
userInfo:nil];
return nil;
}
// Designated initializer
- (instancetype)initPrivate {
self = [super init];
if (self) {
_dictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
实现在头文件中声明的三个实例方法:
- (void)setImage:(UIImage *)image forKey:(NSString *)key {
self.dictionary[key] = image;
}
- (UIImage *)imageForKey:(NSString *)key {
return self.dictionary[key];
}
- (void)deleteImageForKey:(NSString *)key {
if (!key) {
return;
}
[self.dictionary removeObjectForKey:key];
}
当你需要一个模型对象时,需要创建一个继承自NSObject的新类,并且给予它恰当的实例变量。
在BNRItem.h中,添加一个实例变量用来存放图片的键值,如下:
@property (nonatomic, copy) NSString *itemKey; // 存放BNRImageStore中图像的键值
同时打开BNRItem.m文件,导入BNRImageStore头文件,如下:
#import "BNRImageStore.h"
我们将使用通用唯一标识码(Universally Unique Identifier,UUIDs)作为key值。在Objective-C中,用NSUUID类来代表UUID。修改BNRItem.m中的initWithItemName:valueInDollars:serialNumber:方法如下:
// designated initializer
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber
{
// Call the superclass's designated initializer
self = [super init]; // Did the superclass's designated initializer succeed?
if (self) {
// Give the instance variables initial values
_itemName = name;
_serialNumber = sNumber;
_valueInDollars = value;
// Set _dateCreated to the current date and time
_dateCreated = [[NSDate alloc] init]; NSUUID *uuid = [[NSUUID alloc] init];
NSString *key = [uuid UUIDString];
_itemKey = key;
} // Return the address of the newly initialized object
return self;
}
修改BNRDetailViewController.m中的imagePickerController:didFinishPickingMediaWithInfo:方法如下:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
// 从info字典中获取选择的image
UIImage *image = info[UIImagePickerControllerOriginalImage];
[[BNRImageStore sharedImage] setImage:image forKey:self.item.itemKey];
self.imageVeiw.image = image;
// 退出UIImagePickerController
[self dismissViewControllerAnimated:YES completion:nil];
}
当用户每次获取到图片的时候,就会将其存入image store中。BNRImageStore和BNRItem类都知道图像的key,因此能通过两者来获取图片。
打开BNRItemStore.m,导入BNRImageStore的头文件,如下:
#import "BNRImageStore.h"
当删除一个item的时候,需要从image store 中删除其图像,修改removeItem:方法如下:
- (void)removeItem:(BNRItem *)item {
NSString *key = item.itemKey;
[[BNRImageStore sharedImage] deleteImageForKey:key];
[self.privateItems removeObjectIdenticalTo:item];
}
当图片第一次被创建的时候,它将存在于内存中特定的地址中。下一次程序启动的时候,图片在内存中的地址将会发生改变,因此不能通过指针来获取图片。
打开,BNRDetailViewController.m,在类扩展中添加UITextFieldDelegate协议,然后修改textFieldShouldReturn:方法,这样当输入结束时,点击return按钮可隐藏键盘。代码如下:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
为了让用户点击屏幕上的任何地方都能隐藏键盘,首先,打开BNRDetailViewController.xib,选中view视图,打开Attributes Inspector,将其class改为UIControl。
按住view,Control-drag到BNRDetailViewController.m文件的实现处,按下图构造一个action:

修改刚添加的action代码如下:
- (IBAction)backgroundTapped:(id)sender {
[self.view endEditing:YES];
}
程序代码如下:http://pan.baidu.com/s/1c00muxa
UIImagePickerController对象有一个mediaType属性,其为字符串数组,包含标识符,来说明可以选择哪种类型的media。默认只包含kUTTypeImage,可向其添加kUTTypeMovie,使UIImagePickerController能够选择视频。修改BNRDetailViewController.m的takePicture:方法,
- (IBAction)takePicture:(id)sender {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
NSArray *availableType = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
imagePicker.mediaTypes = availableType;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
imagePicker.delegate = self;
[self presentViewController:imagePicker animated:YES completion:nil];
}
真机测试结果如下:

次时在模拟器上测试会遇到会遇到NSInvalidArgumentException错误。只能在真机上测试。
如何免费设置真机调试,请参考下述连接的文章:http://www.bubuko.com/infodetail-1061938.html
在真机上运行时,若出现Security的警告,则在iPhone的设置里面:Settings -> General -> Profiles,选择DEVELOPER APP下的开发者账号,之后选择Trust即可。
UIImageView - BNR的更多相关文章
- Auto Layout - BNR
继续UIImageView - BNR篇. 通过Homepwner TARGETS -> General -> Deployment Info -> Devices中的iPhone改 ...
- Auto Layout: Programmatic Constraints - BNR
继续Auto Layout - BNR篇. 打开BNRDetailViewController.m文件,重载viewDidLoad方法来创建UIImageView对象.当你想要给通过加载NIB文件创建 ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- 6. UIImageView 的使用
1. UIImageView 的认识 QQ:853740091 UIImageView 继承UIView,通过他的名字我们也可以看出这个是用来显示图片的 2. 使用方法 UIImageView *im ...
- UI控件(UIImageView)
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; image1_ = [UIImage imageNa ...
- iOS--使用UIImageView进行GIF动图播放
大家好,好久没有跟新了.其实也就昨天到今天的时间. 前言:实际上,GIF动图文件中包含了一组图片及其信息数组,这些信息数据记录着这一组图片中各张图片的播放时长等信息,我们可以将图片和这些信息或取出来, ...
- UIImageView 自带动画+N张图片实现很炫的动画
gitHub上又看到个很炫的动画:https://github.com/MartinRGB/GiftCard-iOS 看了看他的代码,发现核心动画(就是把按钮包装成一个礼物盒)其实很简单,就是把一 ...
- UIImageView
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. /***** ...
- IOS开发之Bug--关于UIImageView的使用
这里是遇到的一个关于使用UIImageView的小bug,bug就是加载不出来图片. 原因:如果图片资源是jpg文件,如果代码没有加后缀.jpg就会出现不加载出来的情况: 添加上.jpg就能加载出来了 ...
随机推荐
- Python-Django Win7上使用Apache24和mod_wsgi部署Django1.11应用程序
Win7上使用Apache24和mod_wsgi部署Django1.11应用程序 by:授客 QQ:1033553122 测试环境 win7 64 Django-1.11.4.tar.gz 下载地址: ...
- C# 实现截图软件功能
本文是利用C# 开发截图软件的小例子,以供学习分享使用. 思路: 截取屏幕图片. 获取要截取的范围,即左上角,右下角坐标 填充到PictureBox中. 笔触功能,荧光笔,矩形,橡皮擦,复制,保存功能 ...
- 深圳共创力“研发管理&知识管理”高端研讨交流会在深圳举办!
2017/4/8,由深圳市共创力企业管理咨询公司举办的“研发管理&知识管理”高端研讨会在深圳市南山区圣淘沙国际酒店(翡翠店)隆重召开.此次研讨会由共创力总经理.首席顾问杨学明先生主持.研讨会先 ...
- Web前端:博客美化:四、网易云音乐单曲播放器
1.页面定制CSS代码 /*3.音乐播放器*/ .content-wrap { overflow-y: scroll; -webkit-overflow-scrolling: touch; } /* ...
- mac 全角/半角标点符号切换
快捷键:option+shift+H 背景是这样的,前段时间sublimeText新装了HTML/CSS/JS Prittify,JS代码格式化的快捷键是:command+shift+H. 记性有点差 ...
- [20181214]open file using O_DIRECT.txt
[20181214]open file using O_DIRECT.txt --//因为一个测试需要,需要写一个测试小例子,验证使用O_DIRECT打开文件每次都是从磁盘读取.--//没想到浪费1个 ...
- python第一百零八天---Django 3 session 操作
上节内容回顾: 1.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交: 提交 -> url > 函数或类中的方法 - .... Ht ...
- e lisp 常用缓冲区函数详解
e lisp 常用缓冲区函数详解 函数名 函数概要 buffer-name 返回当前缓冲区的名字 buffer-file-name 返回当前缓冲区所指文件的名字,包括路径 current-buffer ...
- LeetCode算法题-Best Time to Buy and Sell Stock II
这是悦乐书的第173次更新,第175篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第32题(顺位题号是122).假设有一个数组,其中第i个元素是第i天给定股票的价格.设计 ...
- Markdown编辑器开发记录(二):Markdown编辑器的使用与开发入门
Markdown编辑器的使用与开发入门 在部门做技术分享的时候简单整理了一下手里的资料 1 是什么 1.1 Markdown是一种轻量级标记语言 Markdown是一种轻量级标记语言,创始人为约翰·格 ...