如何写一个像UIImagePicker一样的自定义图片选择器

来源:互联网 发布:马云淘宝提成怎么算 编辑:程序博客网 时间:2024/06/10 05:00

UIImagePicker是一个简单并且快捷的从用户照片库中使用图片的类库,但是如何让用户在你的app中选择自定义图片呢?

然而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项目中使用它,这似乎是一个通用的需求。