我如何在iOS中创build自定义UIActivity?
我如何在iOS中创build自定义UIActivity
?
我想这样做的原因是在我的一个应用程序中添加一个“审阅应用程序”button,将用户带到App Store的审阅部分。 我如何创build这样一个自定义的UIActivity
?
首先,创build文件。 我select了命名我的ActivityViewCustomActivity
使ActivityViewCustomActivity.h看起来像这样:
#import <UIKit/UIKit.h> @interface ActivityViewCustomActivity : UIActivity @end
使ActivityViewCustomActivity.m看起来像这样:
#import "ActivityViewCustomActivity.h" @implementation ActivityViewCustomActivity - (NSString *)activityType { return @"yourappname.Review.App"; } - (NSString *)activityTitle { return @"Review App"; } - (UIImage *)activityImage { // Note: These images need to have a transparent background and I recommend these sizes: // iPadShare@2x should be 126 px, iPadShare should be 53 px, iPhoneShare@2x should be 100 // px, and iPhoneShare should be 50 px. I found these sizes to work for what I was making. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return [UIImage imageNamed:@"iPadShare.png"]; } else { return [UIImage imageNamed:@"iPhoneShare.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 you can do anything you want, and is the whole reason for creating a custom // UIActivity [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=yourappid"]]; [self activityDidFinish:YES]; } @end
这是我的形象是这样的:这是我做的.PSD: – 恶意链接删除 – 这是原来的250 px .png http://i.imgur.com/pGWVj.png
现在在你的视图控制器中这样做:
#import "ActivityViewCustomActivity.h"
现在,无论你想显示你的UIActivityViewController
:
NSString *textItem = @"Check out the yourAppNameHere app: itunes http link to your app here"; UIImage *imageToShare = [UIImage imageNamed:@"anyImage.png"]; NSArray *items = [NSArray arrayWithObjects:textItem,imageToShare,nil]; ActivityViewCustomActivity *aVCA = [[ActivityViewCustomActivity alloc]init]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:[NSArray arrayWithObject:aVCA]]; activityVC.excludedActivityTypes = @[UIActivityTypePostToWeibo, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll]; activityVC.completionHandler = ^(NSString *activityType, BOOL completed) { NSLog(@"ActivityType: %@", activityType); NSLog(@"Completed: %i", completed); }; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self.popoverController = [[UIPopoverController alloc] initWithContentViewController:activityVC]; CGRect rect = [[UIScreen mainScreen] bounds]; [self.popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:0 animated:YES]; } else { [self presentViewController:activityVC animated:YES completion:nil]; }
这里是我的Swift版本 – 我需要多个自定义操作,所以我创build了这个类。 不需要代表或协议。
1.添加自定义类
class ActivityViewCustomActivity: UIActivity { var customActivityType = "" var activityName = "" var activityImageName = "" var customActionWhenTapped:( (Void)-> Void)! init(title: String, imageName:String, performAction: (() -> ()) ) { self.activityName = title self.activityImageName = imageName self.customActivityType = "Action \(title)" self.customActionWhenTapped = performAction super.init() } override func activityType() -> String? { return customActivityType } override func activityTitle() -> String? { return activityName } override func activityImage() -> UIImage? { return UIImage(named: activityImageName) } override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool { return true } override func prepareWithActivityItems(activityItems: [AnyObject]) { // nothing to prepare } override func activityViewController() -> UIViewController? { return nil } override func performActivity() { customActionWhenTapped() } }
2在View Controller中使用
我把它附加到UIBarButtonItem,它调用以下内容
@IBAction func actionButtonPressed(sender: UIBarButtonItem) { var sharingItems = [AnyObject]() // nothing to share... let myCustomActivity = ActivityViewCustomActivity(title: "Mark Selected", imageName: "removePin") { println("Do something") } let anotherCustomActivity = ActivityViewCustomActivity(title: "Reset All", imageName: "reload") { println("Do something else") } let activityViewController = UIActivityViewController(activityItems:sharingItems, applicationActivities:[myCustomActivity, anotherCustomActivity]) activityViewController.excludedActivityTypes = [UIActivityTypeMail, UIActivityTypeAirDrop, UIActivityTypeMessage, UIActivityTypeAssignToContact, UIActivityTypePostToFacebook, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll] activityViewController.popoverPresentationController?.barButtonItem = sender self.presentViewController(activityViewController, animated: true, completion: nil) }
基于DogCoffee的我的Swift 3实现:
class ActivityViewCustomActivity: UIActivity { // MARK: Properties var customActivityType: UIActivityType var activityName: String var activityImageName: String var customActionWhenTapped: () -> Void // MARK: Initializer init(title: String, imageName: String, performAction: @escaping () -> Void) { self.activityName = title self.activityImageName = imageName self.customActivityType = UIActivityType(rawValue: "Action \(title)") self.customActionWhenTapped = performAction super.init() } // MARK: Overrides override var activityType: UIActivityType? { return customActivityType } override var activityTitle: String? { return activityName } override class var activityCategory: UIActivityCategory { return .share } override var activityImage: UIImage? { return UIImage(named: activityImageName) } override func canPerform(withActivityItems activityItems: [Any]) -> Bool { return true } override func prepare(withActivityItems activityItems: [Any]) { // Nothing to prepare } override func perform() { customActionWhenTapped() } }
以下是使用UIActivity的-activityViewController方法创build电子邮件编辑器界面的示例。 这显示了如何build立一个UIKit viewController或您自己的自定义viewController为您select的任何目的。 它取代了-performActivity方法。
#import <MessageUI/MessageUI.h> #import <UIKit/UIKit.h> @interface EPSuggestionsActivity : UIActivity <MFMailComposeViewControllerDelegate> @end @implementation EPSuggestionsActivity .... - (UIViewController *)activityViewController{ MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; NSString *emailAddress = @"developer@apple.com"; NSArray *toRecipients = @[emailAddress]; [picker setToRecipients:toRecipients]; [picker setSubject:@"Suggestions"]; return picker; } #pragma mark - MFMailComposeViewControllerDelegate Method - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { [self activityDidFinish:YES]; // Forces the activityViewController to be dismissed } @end
请注意,在用户closures电子邮件界面之后,将从邮件编辑器代理调用-activityDidFinish。 这是使UIActivityViewController接口消失所必需的。 如果你编写你自己的viewController,它将需要一个委托方法,它完成后调用,你将不得不使你的UIActivity的子类的委托。