Ios 如何将FBProfilePictureView转换为UIImage?

Ios 如何将FBProfilePictureView转换为UIImage?,ios,facebook-graph-api,uiimage,facebook-ios-sdk,Ios,Facebook Graph Api,Uiimage,Facebook Ios Sdk,FBProfilePictureView一切正常,但我需要从FBProfilePictureView获取该图片并将其转换为UIImage 我该怎么做 我试着用这个: UIGraphicsBeginImageContext(self.profilePictureView.frame.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetIma

FBProfilePictureView一切正常,但我需要从FBProfilePictureView获取该图片并将其转换为UIImage

我该怎么做

我试着用这个:

UIGraphicsBeginImageContext(self.profilePictureView.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.TestPictureOutlet.image = viewImage;

但这不适用于我的解决方案。

FBProfilePictureView是一个UIView,此UIView包含一个UIImageView,即您的图像,您可以从该UIImageView获取UIImage:

profilePictureView是FBProfilePictureView

UIImage *image = nil;

for (NSObject *obj in [profilePictureView subviews]) {
    if ([obj isMemberOfClass:[UIImageView class]]) {
        UIImageView *objImg = (UIImageView *)obj;
        image = objImg.image;
        break;
    }
}
编辑:以另一种方式更快地添加,但要执行相同的操作

__block UIImage *image = nil;

[self.view.subviews enumerateObjectsUsingBlock:^(NSObject *obj, NSUInteger idx, BOOL *stop) {
    if ([obj isMemberOfClass:[UIImageView class]]) {
        UIImageView *objImg = (UIImageView *)obj;
        image = objImg.image;
        *stop = YES;
    }
}];
这里是解决方案

步骤:

确保已将FB用户id分配给类的对象 “FBProfilePictureView”在我的例子中,这个类对象是 “userPictureImageView”

-(void)saveFBUserImage
{
CGSize imageSize=self.userPictureImageView.frame.size;
UIGraphicsBeginImageContext(图像大小);
CGContextRef imageContext=UIGraphicsGetCurrentContext();
[self.userPictureImageView.layer RenderContext:imageContext];
UIImage*viewImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
NSData*imageData=UIIMAGEJPEG表示法(viewImage,1);
UIImage*img=[UIImage imageWithData:imageData];
NSString*文件路径=;
CGSize size=img.size;
如果(尺寸高度>50)
尺寸.高度=50;
如果(尺寸宽度>50)
尺寸.宽度=50;
CGRect rect=CGRectMake(0.0f,0.0f,size.width,size.height);
CGSize size2=rect.size;
UIGraphicsBeginImageContext(大小2);
[img drawInRect:rect];
img=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
NSData*newImageData=UIImageJPEG表示法(img,1.0);
[newImageData writeToFile:文件路径原子:是];
}

就这样。:-)

上述两种解决方案都可以很好地从FBProfilePictureView中获取UIImage对象。 唯一的问题是,您需要在从FBProfilePictureView获取图像之前进行一些延迟。 比如:

[FBRequestForme]startWithCompletionHandler:
^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
如果(!错误){
myNameLbl.text=user.name;
profileDP.profileID=user.id;
//注意这一行,它起到了神奇的作用
[self-performSelector:@selector(getUserImageFromFBView),对象:nil afterDelay:1.0];
}];
-(void)getUserImageFromFBView{
UIImage*img=nil;
//1-获取UIImage obj的解决方案
用于(在[profileDP子视图]中的NSObject*obj){
if([obj IsMemberOf类:[UIImageView类]]){
UIImageView*对象=(UIImageView*)对象;
img=objImg.image;
打破
}
}
//2-获取UIImage obj的解决方案
//UIGraphicsBeginImageContext(profileDP.frame.size);
//[profileDP.layer RenderContext:UIGraphicsGetCurrentContext()];
//img=UIGraphicsGetImageFromCurrentImageContext();
//UIGraphicsSendImageContext();
//在这里,我设置的形象,它的作品100%为我。
testImgv.image=img;
}
问候

阿米尔阿里- iOS应用程序开发人员


@时间组(TGD)

我发现上面的解决方案非常有效,但下面是更新的代码,我发现它更容易使用

 @property FBSDKProfilePictureView *pictureView;

 if ([FBSDKAccessToken currentAccessToken]) {


    self.pictureView=[[FBSDKProfilePictureView alloc]init];

    [self.pictureView setProfileID:@"me"];
    [self.pictureView setPreservesSuperviewLayoutMargins:YES];
    [self.pictureView setPictureMode:FBSDKProfilePictureModeNormal];
    [self.pictureView setNeedsImageUpdate];
    [self performSelector:@selector(getUserImageFromFBView) withObject:nil afterDelay:1.0];

}

-(void) getUserImageFromFBView
{
UIImage *image = nil;

for (NSObject *obj in [self.pictureView subviews]) {
    if ([obj isMemberOfClass:[UIImageView class]]) {
        UIImageView *objImg = (UIImageView *)obj;
        image = objImg.image;
        break;
    }
}
[self.profilePic setImage:image forState:UIControlStateNormal];
}

希望这有帮助。我在这里延迟了1秒以等待配置文件图片加载。

不确定他们为什么不公开UIImage。这是一个蹩脚的解决方案,但您可以使用Graph API并通过URL加载吗?如果图像尚未下载,请返回nil,您需要设置延迟或在下载图像时加载UIImage,否则返回nil,but此代码works@busta117当前位置我尝试了你的ans,最初不起作用,但我最终通过延迟下载使其起作用。谢谢
[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
         if (!error) {

             myNameLbl.text = user.name;
             profileDP.profileID = user.id;

//NOTE THIS LINE WHICH DOES THE MAGIC

[self performSelector:@selector(getUserImageFromFBView) withObject:nil afterDelay:1.0];

}];

- (void)getUserImageFromFBView{

    UIImage *img = nil;

     //1 - Solution to get UIImage obj

     for (NSObject *obj in [profileDP subviews]) {
         if ([obj isMemberOfClass:[UIImageView class]]) {
             UIImageView *objImg = (UIImageView *)obj;
             img = objImg.image;
             break;
         }
     }

    //2 - Solution to get UIImage obj

//    UIGraphicsBeginImageContext(profileDP.frame.size);
//    [profileDP.layer renderInContext:UIGraphicsGetCurrentContext()];
//    img = UIGraphicsGetImageFromCurrentImageContext();
//    UIGraphicsEndImageContext();

//Here I'm setting image and it works 100% for me.

   testImgv.image = img;

}
 @property FBSDKProfilePictureView *pictureView;

 if ([FBSDKAccessToken currentAccessToken]) {


    self.pictureView=[[FBSDKProfilePictureView alloc]init];

    [self.pictureView setProfileID:@"me"];
    [self.pictureView setPreservesSuperviewLayoutMargins:YES];
    [self.pictureView setPictureMode:FBSDKProfilePictureModeNormal];
    [self.pictureView setNeedsImageUpdate];
    [self performSelector:@selector(getUserImageFromFBView) withObject:nil afterDelay:1.0];

}

-(void) getUserImageFromFBView
{
UIImage *image = nil;

for (NSObject *obj in [self.pictureView subviews]) {
    if ([obj isMemberOfClass:[UIImageView class]]) {
        UIImageView *objImg = (UIImageView *)obj;
        image = objImg.image;
        break;
    }
}
[self.profilePic setImage:image forState:UIControlStateNormal];
}