【发布时间】:2014-09-16 17:03:04
【问题描述】:
我有一个更大的应用程序,应该能够共享多个图像。 我使用 UIActivityViewController 和 UIActivityItemProvider 实现了这一点,以异步使用这些项目(这样我一次只需要准备一个图像,而不必一次将所有图像填满内存来共享它们)。
我受到 Apple Airdrop 示例的“启发”: AirdropSample download
但是,当使用我的应用分享时,例如9 张图像(到相机胶卷 ==“保存 9 张图像”)只有 4 到 7 张图像最终在相机胶卷中,没有任何错误消息。 如果我一遍又一遍地重复,有时我会得到 5 张图片或 6 张看似随机的图片。
我无法在此处发布我的应用程序,但我修改了上述示例,使其在将所有图像传送到相机胶卷时也会随机“失败”...
如果你下载上面的示例并用这些替换4个文件,它就会显示问题:
APLAsyncImageViewController.h:
#import <UIKit/UIKit.h>
#import "APLAsyncImageActivityItemProvider.h"
@interface APLAsyncImageViewController : UIViewController
@end
APLAsyncImageViewController.m:
#import "APLAsyncImageViewController.h"
#import "APLProgressAlertViewController.h"
NSString * const kProgressAlertViewControllerIdentifier = @"APLProgressAlertViewController";
@interface APLAsyncImageViewController ()
@property (strong, nonatomic) UIWindow *alertWindow;
@property (strong, nonatomic) APLProgressAlertViewController *alertViewController;
@property (strong, nonatomic) UIPopoverController *activityPopover;
@property (weak, nonatomic) IBOutlet UIButton *shareImageButton;
- (IBAction)openActivitySheet:(id)sender;
@end
@implementation APLAsyncImageViewController
- (IBAction)openActivitySheet:(id)sender
{
NSMutableArray *itemArray = [[NSMutableArray alloc] init];
for( int i = 0; i < 9;i++)
{
APLAsyncImageActivityItemProvider *aiImageItemProvider = [[APLAsyncImageActivityItemProvider alloc] init];
[itemArray addObject: aiImageItemProvider];
}
//Create an activity view controller with the activity provider item. UIActivityItemProvider (AsyncImageActivityItemProvider's superclass) conforms to the UIActivityItemSource protocol
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:itemArray applicationActivities:nil];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
//iPhone, present activity view controller as is
[self presentViewController:activityViewController animated:YES completion:nil];
}
else
{
//iPad, present the view controller inside a popover
if (![self.activityPopover isPopoverVisible]) {
self.activityPopover = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
[self.activityPopover presentPopoverFromRect:[self.shareImageButton frame] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
else
{
//Dismiss if the button is tapped while pop over is visible
[self.activityPopover dismissPopoverAnimated:YES];
}
}
}
@end
APLAsyncImageActivityItemProvider.h:
#import <UIKit/UIKit.h>
@interface APLAsyncImageActivityItemProvider : UIActivityItemProvider
@end
APLAsyncImageActivityItemProvider.m:
#import "APLAsyncImageActivityItemProvider.h"
#import "UIImage+Resize.h"
@implementation APLAsyncImageActivityItemProvider
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return [[UIImage alloc] init];
}
- (id)item
{
UIImage *image = [UIImage imageNamed:@"Flower.png"];
//CGSize imageSize;
//imageSize.height = 1000;
//imageSize.width = 1000;
//image = [UIImage imageWithImage:image scaledToFitToSize:imageSize];
return image;
}
- (UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(NSString *)activityType suggestedSize:(CGSize)size
{
//The filtered image is the image to display on the other side.
return [[UIImage alloc] init];
}
@end
如果您像这样执行示例(使用菜单项“预处理后发送图像”,按“共享”按钮),它通常或大部分都无法将所有 9 张图像传送到相机胶卷。
如果您取消注释“APLAsyncImageActivityItemProvider.m”中基本上只是缩放输出图像的 4 行,那么它将始终有效。
你能告诉我为什么吗?我觉得如果我知道这个谜语的答案,我也可以修复我的应用程序。
谢谢,
尼尔斯
【问题讨论】:
-
我遇到了同样的问题。你有没有找到解决这个问题的方法?
标签: ios objective-c uiactivityviewcontroller