4つのオプションを持つUIActivityViewController
があります:Message/Mail/TW/FB。オプションごとに異なるアクティビティを送信したい!
たとえば:iMessage
シートには、String
、NSURL
、およびUIImage
を配置する必要があります。メールでは、件名フィールドに文字列を配置し、次に本文に文字列、UIImage
およびNSURL
を配置する必要があります。 TW/FB
私はソーシャル投稿のように画像を配置したい、またいくつかの文字列とNSURL
を配置したい。
Swiftを使用して、これがiOS8で可能かどうか考えていますか?
私はコードのいくつかの部分をたくさん検索しましたが、私にとって最良のコードは見つかりませんでした。
UIActivityItemSource
プロトコルを利用する必要があります。 activityItems
の初期化子のUIActivityViewController
パラメーターは、データオブジェクトの配列またはUIActivityItemSource
プロトコルを実装するオブジェクトの配列のいずれかを受け入れます。
例として、次のようなアイテムソースを考えます。
class MyStringItemSource: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
if activityType == UIActivityTypeMessage {
return "String for message"
} else if activityType == UIActivityTypeMail {
return "String for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "String for Twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "String for facebook"
}
return nil
}
func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
if activityType == UIActivityTypeMessage {
return "Subject for message"
} else if activityType == UIActivityTypeMail {
return "Subject for mail"
} else if activityType == UIActivityTypePostToTwitter {
return "Subject for Twitter"
} else if activityType == UIActivityTypePostToFacebook {
return "Subject for facebook"
}
return ""
}
func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String!, suggestedSize size: CGSize) -> UIImage! {
if activityType == UIActivityTypeMessage {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityTypeMail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityTypePostToTwitter {
return UIImage(named: "thumbnail-for-Twitter")
} else if activityType == UIActivityTypePostToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
上記の項目ソースは、アクティビティタイプに基づいてさまざまな文字列データオブジェクト、件名、およびサムネイル画像を返します。使用するには、それをUIActivityViewController
初期化子に渡すだけです。
UIActivityViewController(activityItems: [MyStringItemSource()], applicationActivities: nil)
同様に、選択したアクティビティに基づいて異なるURLを返すカスタムMyUrlItemSource
クラスを定義し、初期化子に渡すことができます。
UIActivityViewController(activityItems: [MyStringItemSource(), MyUrlItemSource()], applicationActivities: nil)
このすべては UIActivityViewController
および UIActivityItemSource
の公式ドキュメントで概説されています
hennes からSwift 3に変換されるような同じソリューション
class MyStringItemSource: NSObject, UIActivityItemSource {
public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == UIActivityType.message {
return "String for message"
} else if activityType == UIActivityType.mail {
return "String for mail"
} else if activityType == UIActivityType.postToTwitter {
return "String for Twitter"
} else if activityType == UIActivityType.postToFacebook {
return "String for facebook"
}
return nil
}
public func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
if activityType == UIActivityType.message {
return "Subject for message"
} else if activityType == UIActivityType.mail {
return "Subject for mail"
} else if activityType == UIActivityType.postToTwitter {
return "Subject for Twitter"
} else if activityType == UIActivityType.postToFacebook {
return "Subject for facebook"
}
return ""
}
public func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivityType?, suggestedSize size: CGSize) -> UIImage? {
if activityType == UIActivityType.message {
return UIImage(named: "thumbnail-for-message")
} else if activityType == UIActivityType.mail {
return UIImage(named: "thumbnail-for-mail")
} else if activityType == UIActivityType.postToTwitter {
return UIImage(named: "thumbnail-for-Twitter")
} else if activityType == UIActivityType.postToFacebook {
return UIImage(named: "thumbnail-for-facebook")
}
return UIImage(named: "some-default-thumbnail")
}
}
Objective-Cと同等の hennes answer:
@interface MyStringItemSource : NSObject <UIActivityItemSource>
{
}
@end
@implementation MyStringItemSource
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return @"";
}
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"String for message";
} else if (activityType == UIActivityTypeMail) {
return @"String for mail";
}
return nil;
}
-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType
{
if (activityType == UIActivityTypeMessage) {
return @"Subject for message";
} else if (activityType == UIActivityTypeMail) {
return @"Subject for mail";
}
return @"";
}
-(UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(UIActivityType)activityType suggestedSize:(CGSize)size
{
if (activityType == UIActivityTypeMessage) {
return [UIImage imageNamed: @"thumbnail-for-message"];
} else if (activityType == UIActivityTypeMail) {
return [UIImage imageNamed: @"thumbnail-for-mail"];
}
return [UIImage imageNamed: @"thumbnail-for-default"];
}
@end