添加自定义活动到UIActivityController的问题

我正在尝试执行标准活动(打印,邮件,FaceBook等)的自定义活动,但现在只需要标准打印(用于AirPrint)和我自己的自定义打印通过直接的方法。 我明显错过了一些基本的东西,因为我的自定义类中没有任何方法被调用。 现在我只有一些NSLog语句来找出调用序列,并获得框架的function。

以下是我的自定义活动类的testing代码:

// PrintActivity.h #import <UIKit/UIKit.h> @interface PrintActivity : UIActivity @end 

还有他们

 #import "PrintActivity.h" @interface PrintActivity () @property (nonatomic, strong) UIWebView *dummyWebView; @end @implementation PrintActivity - (NSString *)activityType { NSLog(@"activityType"); return @"MetriScan Print"; } - (NSString *)activityTitle { NSLog(@"activityTitle"); return @"MetriScan\nPrint"; } - (UIImage *)activityImage { NSLog(@"activityImage"); UIImage *icon = [UIImage imageNamed:@"metriscan_57_c2a_3.png"]; return icon; } - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { NSLog(@"canPerformWithActivityItems"); return YES; } - (void)prepareWithActivityItems:(NSArray *)activityItems { NSLog(@"prepareWithActivityItems"); } - (void)performActivity { NSLog(@"Do the actual printing here"); // My custom code here } 

这是主程序中的调用:

 - (IBAction)printReport:(UIBarButtonItem *)sender { NSLog(@"Print Report"); PrintActivity *metriscanPrint = [[PrintActivity alloc] init]; UIViewPrintFormatter *printFormatter = [self.webView viewPrintFormatter]; NSArray *activityItems = [NSArray arrayWithObjects:printFormatter, nil]; NSArray *appActivities = [NSArray arrayWithObjects:metriscanPrint, nil]; UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:appActivities]; //activityController.excludedActivityTypes = [NSArray arrayWithObjects:UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypeMail, UIActivityTypeMessage, nil]; activityController.completionHandler = ^(NSString *activityType, BOOL completed) { sender.enabled = YES; }; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { [self presentViewController:activityController animated:YES completion:nil]; } else { sender.enabled = NO; self.printPop = [[UIPopoverController alloc] initWithContentViewController:activityController]; [self.printPop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES]; } 

正如我所说,自定义类中的方法都不会被调用,但系统邮件,消息和复制图标显示在活动表单中,而不是“打印”图标。 我只想系统打印图标(和我自己的)。

如果我取消注释上面的语句块(并注释掉NSArray * activityItems ………..)进一步下来,系统邮件,消息,打印和复制图标。 在这个实验中,我想我通过创build自己的格式化程序来混合不同的方法,但这似乎是WWDC 2012的build议?

如果我然后用'excludeActivityTypes'取消注释行,我只能得到系统打印图标。

我欢迎任何意见来帮助我解决这个问题。

如果有人知道任何示例代码做我想要的,那将是了不起的。

编辑:更新代码到我的工作代码。

在过去的这个星期,我还是在UIActivity上发表了自己的观点,苹果真的需要更好的解释,并且增加了更多的function。 尝试这个:

PrintActivity.h

 #import <UIKit/UIKit.h> @interface PrintActivity : UIActivity @end 

PrintActivity.m

 #import "PrintActivity.h" @implementation PrintActivity - (NSString *)activityType { return @"MetriScan.Print"; } - (NSString *)activityTitle { return @"Print MtriScan"; } - (UIImage *)activityImage { //***** Note: I recommend using two sizes, as the iPad's UIActivity image size differs from //***** the iPhone's. Also, create @2x sizes for Retina compatible devices. So you will //***** have a total of 4 images. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return [UIImage imageNamed:@"test_72.png"]; } return [UIImage imageNamed:@"test_57.png"]; } - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { NSLog(@"%s", __FUNCTION__); return YES; } - (void)prepareWithActivityItems:(NSArray *)activityItems { NSLog(@"%s",__FUNCTION__); } - (UIViewController *)activityViewController { NSLog(@"%s",__FUNCTION__); return nil; } - (void)performActivity { // This is where your custom print code should go } @end 

不要忘记做这两个文件:

PrintProvider.h

 #import <UIKit/UIKit.h> @interface PrintProvider : UIActivityItemProvider <UIActivityItemSource> @end 

PrintProvider.m

 #import "PrintProvider.h" @implementation PrintProvider #pragma mark - UIActivityItemSource - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { NSLog(@"%s",__FUNCTION__); NSLog(@"%@", activityType); return [super activityViewController:activityViewController itemForActivityType:activityType]; } @end 

现在我们终于可以称之为:

 - (IBAction)printReport:(UIBarButtonItem *)sender { CustomProvider *customProvider = [[CustomProvider alloc]init]; NSArray *items = [NSArray arrayWithObjects:customProvider,nil]; CustomActivity *ca = [[CustomActivity alloc]init]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:[NSArray arrayWithObject:ca]]; activityVC.excludedActivityTypes = @[UIActivityTypePostToWeibo, UIActivityTypeAssignToContact,UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll,UIActivityTypeMail,UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,UIActivityTypeMessage]; activityVC.completionHandler = ^(NSString *activityType, BOOL completed) { NSLog(@" activityType: %@", activityType); NSLog(@" completed: %i", completed); }; self.popoverController = [[UIPopoverController alloc] initWithContentViewController:activityVC]; CGRect rect = [[UIScreen mainScreen] bounds]; [self.popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:0 animated:YES]; } 

@ troop231 – 伟大的答案,并非常有帮助。

我唯一要添加的是确保表示完成操作或完成例程不会被调用,并且popup不会消失。 就像是:

 - (void)performActivity { NSLog(@"Do the actual activity here"); // My custom code here [self activityDidFinish:YES]; // indicate completion here!! } 

感谢您的帮助,伙计们! 而且,对于活动图像,似乎我们必须通过Apple文档提供以下图像:

图像的alpha通道用作蒙版,以生成呈现给用户的最终图像。 图像中的任何颜色数据都被忽略。 不透明像素具有应用于它们的渐变,然后将此渐变放置在标准背景的顶部。 因此,完全不透明的图像将产生梯度填充的矩形。 对于iPhone和iPod touch,图像不得大于43乘43点(相当于使用Retina显示器的设备为86乘86像素)。对于iPad,图像不得大于55 x 55点(相当于110 x带有视网膜显示器的iPad的110像素。)