在 ScrollView 中显示从相机拍摄的图像
Show taken images from camera in a ScrollView
我有一个只有一个按钮的简单应用程序。
当用户点击它时,他可以拍照,在相机中点击"Done",然后可以保存并在ScrollView 上看到。
但是,当他正在拍摄另一张照片并在相机中单击 "Done" 时,新照片会覆盖之前的照片,他只能看到自己拍摄的照片。
我想保存所有这些图片,然后如果用户拍摄了 4-5 张图片,他可以通过滚动查看所有图片。
这是我的代码,我不确定为什么它不起作用。
- (IBAction)Camera:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
NSMutableArray *images = [NSMutableArray arrayWithCapacity:[info count]];
for (UIView *v in [_scrollView subviews]) {
[v removeFromSuperview];
}
[self dismissViewControllerAnimated:YES completion:nil];
UIImage* image=[info valueForKey:@"UIImagePickerControllerEditedImage"];
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
[_scrollView addSubview:imageview];
[images addObject:image];
self.chosenImages = images;
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
[_scrollView setPagingEnabled:YES];
}
并且在 header 中我有一组 chosenImages
@属性(非原子,复制)NSArray *chosenImages;
假设self.chosenImages
是NSMutableArray
类型,试试这个
[self.chosenImages addObjectsFromArray:images]
而不是
self.chosenImages = images;
如果它不是可变的,您可以随时设置它:
NSMutableArray *newArray = [self.chosenImages mutableCopy];
newArray = [newArray addObjectsFromArray:images];
self.chosenImages = [newArray copy];
您的代码有很多问题。每次用户选择图像时,您都会从滚动视图中删除所有子视图,然后仅添加单个选定图像。
您有一个数组 chosenImages,您可以使用它来保存所有选定的图像,但您将其替换为一个新数组 images,该数组仅包含单个新选定的图像。
您将图像分配为一个可变数组,该数组的容量足以满足您在 didFinishPickingMediaWithInfo 中获得的信息字典的计数,但这样做没有意义。该字典的计数将是字典中 key/value 对的数量,这不反映用户选择的图像数量(我相信用户选择的图像数量将始终为 1,忽略不同的格式,例如原始图像和(可能的)编辑图像。)
我建议将以前的图像保留在滚动视图中,跟踪这些图像的数量和位置,并在用户选择后简单地将新图像添加到滚动视图。
您可能会考虑在页面滚动模式下使用 UIPageViewController 而不是原始滚动视图。它比滚动视图更好地管理分页滚动。 Apple 有一个名为 PhotoScroller (link) 的示例应用程序,它甚至支持图像的平铺渲染、双指缩放和平移图像。将该代码拼接到您的应用程序中以处理这些图像将非常容易。 (您可能不会决定处理平铺图像 - 我将具有平铺图像支持的 PhotoScroller 代码改编为客户端项目,生成图像平铺是一项相当大的工作量。)
我有一个只有一个按钮的简单应用程序。 当用户点击它时,他可以拍照,在相机中点击"Done",然后可以保存并在ScrollView 上看到。
但是,当他正在拍摄另一张照片并在相机中单击 "Done" 时,新照片会覆盖之前的照片,他只能看到自己拍摄的照片。
我想保存所有这些图片,然后如果用户拍摄了 4-5 张图片,他可以通过滚动查看所有图片。
这是我的代码,我不确定为什么它不起作用。
- (IBAction)Camera:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
NSMutableArray *images = [NSMutableArray arrayWithCapacity:[info count]];
for (UIView *v in [_scrollView subviews]) {
[v removeFromSuperview];
}
[self dismissViewControllerAnimated:YES completion:nil];
UIImage* image=[info valueForKey:@"UIImagePickerControllerEditedImage"];
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
[_scrollView addSubview:imageview];
[images addObject:image];
self.chosenImages = images;
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
[_scrollView setPagingEnabled:YES];
}
并且在 header 中我有一组 chosenImages
@属性(非原子,复制)NSArray *chosenImages;
假设self.chosenImages
是NSMutableArray
类型,试试这个
[self.chosenImages addObjectsFromArray:images]
而不是
self.chosenImages = images;
如果它不是可变的,您可以随时设置它:
NSMutableArray *newArray = [self.chosenImages mutableCopy];
newArray = [newArray addObjectsFromArray:images];
self.chosenImages = [newArray copy];
您的代码有很多问题。每次用户选择图像时,您都会从滚动视图中删除所有子视图,然后仅添加单个选定图像。
您有一个数组 chosenImages,您可以使用它来保存所有选定的图像,但您将其替换为一个新数组 images,该数组仅包含单个新选定的图像。
您将图像分配为一个可变数组,该数组的容量足以满足您在 didFinishPickingMediaWithInfo 中获得的信息字典的计数,但这样做没有意义。该字典的计数将是字典中 key/value 对的数量,这不反映用户选择的图像数量(我相信用户选择的图像数量将始终为 1,忽略不同的格式,例如原始图像和(可能的)编辑图像。)
我建议将以前的图像保留在滚动视图中,跟踪这些图像的数量和位置,并在用户选择后简单地将新图像添加到滚动视图。
您可能会考虑在页面滚动模式下使用 UIPageViewController 而不是原始滚动视图。它比滚动视图更好地管理分页滚动。 Apple 有一个名为 PhotoScroller (link) 的示例应用程序,它甚至支持图像的平铺渲染、双指缩放和平移图像。将该代码拼接到您的应用程序中以处理这些图像将非常容易。 (您可能不会决定处理平铺图像 - 我将具有平铺图像支持的 PhotoScroller 代码改编为客户端项目,生成图像平铺是一项相当大的工作量。)