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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值