使用UIActivityViewController失败的Instagram共享文本覆盖图像

使用UIActivityViewController失败的Instagram共享文本覆盖图像

问题描述:

我正在使用UIActivityViewController和UIActivityItemSource的子类来通过安装在我的iPhone上的应用程序共享文本和图像。使用UIActivityViewController失败的Instagram共享文本覆盖图像

经过一番调查,如果发现不可能与Instagram应用共享“文字”和“图片”。

因此,我们决定在图片本身上覆盖文字(Instagram标题)(静态图片,在我的情况下是Lion.png,包含在资源文件夹中)。但是我发现,如果我要使用Instagram应用程序(使用UIActivityViewController显示)分享“文本覆盖图像”,虽然Instagram应用程序与图像一起启动,但当我输入标题并点击分享按钮时,虽然看起来像该共享成功,但图像不被共享。

通过电子邮件客户端共享修改过的png是成功的。不知道为什么Instagram失败。

如果我决定通过Instagram分享没有“文字叠加”的原始图像,那么在Instagram上分享是成功的。

注意:下面的代码,我已经从我的项目中提取出来并放入一个示例项目。

#import "ViewController.h" 
#import "EmailItemProvider.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(UIImage*) drawText:(NSString*) text 
      inImage:(UIImage*) image 
      atPoint:(CGPoint) point 
{ 

    UIFont *font = [UIFont boldSystemFontOfSize:14]; 
    UIGraphicsBeginImageContext(image.size); 
    [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)]; 
    CGRect rect = CGRectMake(point.x, point.y, image.size.width, image.size.height); 
    // [[UIColor whiteColor] set]; 
    // [text drawInRect:CGRectIntegral(rect) withFont:font]; 


    /// Make a copy of the default paragraph style 
    NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping; 
    paragraphStyle.alignment = NSTextAlignmentLeft; 

    NSDictionary *attributes = @{ NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor whiteColor],NSParagraphStyleAttributeName: paragraphStyle }; 

    // draw text 
    [text drawInRect:rect withAttributes:attributes]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

- (NSString*)saveImageFile:(UIImage *)uiimage 
{ 
    NSData *data = UIImagePNGRepresentation(uiimage); 
    NSString *filePath = [NSString stringWithFormat:@"%@/sample.png" ,[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]]; 
    [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; 
    [data writeToFile:filePath atomically:YES]; 
    return filePath; 
} 

#define SEND_TO_MESSAGE @"Share via Message" 
#define SEND_TO_MAIL @"Share via Mail" 


- (IBAction)ShareOptions:(id)sender { 


    UIImage *annotatedFile = [self drawText: @"Referral msg with code" inImage:[UIImage imageNamed:@"Lion"] atPoint: CGPointMake(0, 0)]; 
    NSString *imageFilePath = [self saveImageFile:annotatedFile]; 

    NSMutableDictionary *shareOptionDic=[[NSMutableDictionary alloc] init]; 
    [shareOptionDic setObject:SEND_TO_MESSAGE forKey:@"1"]; 
    [shareOptionDic setObject:SEND_TO_MAIL forKey:@"2"]; 

    UIPasteboard *pb = [UIPasteboard generalPasteboard]; 
    [pb setString:@"Referral message copied to the clipboard."]; 

    EmailItemProvider *emailItem = [EmailItemProvider new]; 
    emailItem.subject = @"sample subject";//Dummy. overridden in the delegate methods of EmailItemProvider. 
    emailItem.body = @"sample body";//Dummy. overridden in the delegate methods of EmailItemProvider. 


    //Image with the text overlay. When this image is used, the Instagram share fails. 
    emailItem.imagePath = imageFilePath; 

    UIActivityViewController *activityViewController = 
    [[UIActivityViewController alloc] initWithActivityItems:@[emailItem] 
             applicationActivities:nil]; 


    activityViewController.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint,UIActivityTypeAirDrop]; 
    [self presentViewController:activityViewController animated:TRUE completion:nil]; 
    return; 
} 


@end 

类EmailItemProvider从UIActivityItemSource子类,而它的.H和.M如下。

// 
// EmailItemProvider.h 
// 
// 

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface EmailItemProvider : NSObject <UIActivityItemSource> 
@property (nonatomic, strong) NSString *subject; 
@property (nonatomic, strong) NSString *body; 
@property (nonatomic, strong) UIImage *image;//dummy 
@property (nonatomic, strong) NSString *imagePath;//image path with text overlay 
@end 



// 
// EmailItemProvider.m 
// 
// 

#import "EmailItemProvider.h" 

@implementation EmailItemProvider 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { 

    //This code works. 
    //return [UIImage imageNamed:@"Lion"]; 

    //Returning an text overlayed image for Instagram share doesnot work. 
    return [UIImage imageWithContentsOfFile:self.imagePath]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { 
    NSLog(@"one %@", activityType); 


    //This code which return an image overlayed with text, instagram share fails. 
    return @{@"text": @"Referral information goes here.", @"image": [UIImage imageWithContentsOfFile:self.imagePath]}; 


    //I am able to share Instagram share when I comment the above code and uncomment the below code. 
    //return @{@"text": @"Referral information goes here.", @"image": [UIImage imageNamed:@"Lion"]}; 
} 


- (nullable UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(nullable UIActivityType)activityType suggestedSize:(CGSize)size; // if activity supports preview image. iOS 7.0 
{ 

    NSLog(@"two activity type : %@\n", activityType); 
    return [UIImage imageNamed:@"Lion"]; 

} 


- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType { 

    NSLog(@"three %@", activityType); 
    return @"subject text"; 
} 

@end 

我认为这个问题是因为图像的大小。当源图像(超级强加文本)为236×374时,Instagram分享失败。

但是,当我使用442×620 png图像作为基本图像时,我可以在叠加文本后共享图像。

虽然有一个问题没有答案。这个香草236×374图片(没有文字叠加)如何通过Instagram成功分享?