如何写一个像UIImagePicker一样的自定义图片选择器
2012-01-30 18:05
225 查看
UIImagePicker是一个简单并且快捷的从用户照片库中使用图片的类库,但是如何让用户在你的app中选择自定义图片呢?
然而UIImagePicker并没有任何功能能够实现让你显示自定义图片。不过在本教程中,我们会教会你创建自己的选择器,一个类似于UIImagePicker,并且也很容易使用的自定义图片选择器!
创建视图
基本思路是:我们有一个按钮“Choose Custom Image”,用户可以点击它,一旦轻按这个按钮,将会通过navigation控制器push一个新的view控制器显示图片。用户通过图像滚动方式浏览,并且点击喜欢的图片,就像UIImagePicker一样。
最简单的方式实现,就是在viewDidLoad方法上实现编码。我们将创建一个UIScrollView视图包含设置选择图片的UIButton网格内容。
让我们假设一下,我们有一个64×64大小的用于显示的缩略图数组和一个用于显示的全尺寸图片数组。在这种情况下,相关代码如下所示:
代码很简单,不需要更多的解释,但有几件事需要指出
我设置按钮的tag字段为缩略图数据索引,方便后面代码识别。
别忘记最后调用UIScrollView中的setContentSize方式,让滚动视图设置正确的内容区域,否则会有无法实现滚动。
选择一个图片
由于我们使用按钮表示图像,当选择一个图片时,会得到一个按钮通知:
图片大小
通常我们会让用户浏览图像缩略图,但选择图片后,将会使用全尺寸的图片。那么有什么好方法实现这个功能呢?以下有两种方式:
动态调整图片大小。在示例项目中有一个经常使用的辅助函数:imageByScalingAndCroppingForSize,不需要在项目中包括每个图片的缩略图(这可以节省空间)。但代价是如果你有很多图片需要调整大小,那么在设备上缩放图片会比较慢。
在项目中,添加每个图片的缩略图和全尺寸图。这样会多做一些工作,同时也需要有更多的空间。记住一件事,一旦你的app大小超过10M。那么购买app的用户就不能通过手机网络下载,他们必须通过Wi-Fi或者同步方式下载安装。这可能会影响销售。
查阅我的代码
这是一个有关上面讨论的代码例子,可以任意在自己的项目中使用。就我个人而言,已经在两个iPhone项目中使用它,这似乎是一个通用的需求。
然而UIImagePicker并没有任何功能能够实现让你显示自定义图片。不过在本教程中,我们会教会你创建自己的选择器,一个类似于UIImagePicker,并且也很容易使用的自定义图片选择器!
创建视图
基本思路是:我们有一个按钮“Choose Custom Image”,用户可以点击它,一旦轻按这个按钮,将会通过navigation控制器push一个新的view控制器显示图片。用户通过图像滚动方式浏览,并且点击喜欢的图片,就像UIImagePicker一样。
最简单的方式实现,就是在viewDidLoad方法上实现编码。我们将创建一个UIScrollView视图包含设置选择图片的UIButton网格内容。
让我们假设一下,我们有一个64×64大小的用于显示的缩略图数组和一个用于显示的全尺寸图片数组。在这种情况下,相关代码如下所示:
- (void)viewDidLoad { UIScrollView *view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; int row = 0; int column = 0; for(int i = 0; i < _thumbs.count; ++i) { UIImage *thumb = [_thumbs objectAtIndex:i]; UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(column*100+24, row*80+10, 64, 64); [button setImage:thumb forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; button.tag = i; [view addSubview:button]; if (column == 2) { column = 0; row++; } else { column++; } } [view setContentSize:CGSizeMake(320, (row+1) * 80 + 10)]; self.view = view; [view release]; [super viewDidLoad]; }
代码很简单,不需要更多的解释,但有几件事需要指出
我设置按钮的tag字段为缩略图数据索引,方便后面代码识别。
别忘记最后调用UIScrollView中的setContentSize方式,让滚动视图设置正确的内容区域,否则会有无法实现滚动。
选择一个图片
由于我们使用按钮表示图像,当选择一个图片时,会得到一个按钮通知:
- (IBAction)buttonClicked:(id)sender { UIButton *button = (UIButton *)sender; UIImage *selectedImage = [_images objectAtIndex:button.tag]; // Do something with image! }
图片大小
通常我们会让用户浏览图像缩略图,但选择图片后,将会使用全尺寸的图片。那么有什么好方法实现这个功能呢?以下有两种方式:
动态调整图片大小。在示例项目中有一个经常使用的辅助函数:imageByScalingAndCroppingForSize,不需要在项目中包括每个图片的缩略图(这可以节省空间)。但代价是如果你有很多图片需要调整大小,那么在设备上缩放图片会比较慢。
在项目中,添加每个图片的缩略图和全尺寸图。这样会多做一些工作,同时也需要有更多的空间。记住一件事,一旦你的app大小超过10M。那么购买app的用户就不能通过手机网络下载,他们必须通过Wi-Fi或者同步方式下载安装。这可能会影响销售。
查阅我的代码
这是一个有关上面讨论的代码例子,可以任意在自己的项目中使用。就我个人而言,已经在两个iPhone项目中使用它,这似乎是一个通用的需求。
相关文章推荐
- Android初级教程:如何自定义一个状态选择器
- 自定义一个jquery方法;自定义选择器;预加载图片
- 源码推荐(7.28):习惯了的Sqlite,自己动手造一个可以深度自定义的图片选择器
- Android初级教程:如何自定义一个状态选择器
- 今天来用一个例子来详细讲解下nutch当中到底是如何自定义插件的
- 分享到微信时如何自定义文字描述和图片
- 如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置
- WindowsMobile如何自定义一个ToolBar?[币多理财助手部分源码]
- 自定义一个简单的可以加载网络图片的ImageView
- 如何使用V2005建立一个BHO组件--响应documentcomplete事件,去除页面中的图片
- Android 自定义view-如何设置TextView drawableLeft 图片大小?
- 如何搭建一个属于自己的轻博客。。。向网易轻博客一样
- 如何在窗口绘制背景图片,并且在图片上话一个矩形
- 如何随机产生一个自定义长度的字符串?
- 分享一个实现图片圆角,圆的自定义的ImageView,尽可能少的减少内存消耗。
- 在SqlServer2005 中自定义一个 Split函数与C#中的Split功能一样
- 如何在SharePoint里自定义WebPart将搜索结果显示在同一个界面
- Android 如何自定义一个简单的组件和自定义的点击事件(中级)
- 如何在不接入微信API的情况下自定义分享内容(图片、链接、标题)
- 如何把.rar文件隐藏在一个图片内