2012-08-09 32 views
16

Mọi thứ đều hoạt động tốt với FBProfilePictureView nhưng tôi cần lấy ảnh đó từ FBProfilePictureView và biến nó thành UIImage.Làm cách nào để chuyển đổi FBProfilePictureView thành UIImage?

Tôi nên làm như thế nào?

tôi đã cố gắng sử dụng này:

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

Nhưng điều này doesnt làm việc cho giải pháp của tôi.

+0

Không chắc chắn lý do tại sao họ không hiển thị UIImage. Giải pháp lame, nhưng bạn có thể chỉ cần sử dụng Graph API và tải thông qua URL? –

Trả lời

17

FBProfilePictureView là một UIView, UIView này chứa một UIImageView, đó là hình ảnh của bạn, bạn có thể lấy UIImage từ UIImageView rằng:

profilePictureView là một FBProfilePictureView

UIImage *image = nil; 

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

EDIT: thêm một nhanh hơn nhưng cũng làm như vậy

__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; 
    } 
}]; 
+2

Điều này trả về nil –

+2

Yup ... trả về số không. Điều này có hiệu quả với bất kỳ ai không? – Dev

+1

trả lại nil nếu hình ảnh chưa được tải xuống, bạn cần đặt độ trễ hoặc tải UIImage khi hình ảnh được tải xuống, nếu không trả về 0 nhưng mã này hoạt động – busta117

0

Đây là giải pháp.

bước sau:

Hãy chắc chắn rằng bạn đã gán id người dùng FB để đối tượng của lớp "FBProfilePictureView" trong trường hợp của tôi đối tượng lớp này là "userPictureImageView"

-(void)saveFBUserImage 
{ 

    CGSize imageSize = self.userPictureImageView.frame.size; 

    UIGraphicsBeginImageContext(imageSize); 
    CGContextRef imageContext = UIGraphicsGetCurrentContext(); 

    [self.userPictureImageView.layer renderInContext: imageContext]; 
    UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    NSData *imageData = UIImageJPEGRepresentation(viewImage,1); 

    UIImage * img = [UIImage imageWithData:imageData]; 

    NSString *filePath = <specify your path here>; 

    CGSize size = img.size; 

    if(size.height > 50) 
     size.height = 50; 
    if(size.width > 50) 
     size.width = 50; 

    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); 
    CGSize size2 = rect.size; 

    UIGraphicsBeginImageContext(size2); 

    [img drawInRect:rect]; 
    img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSData *newImageData = UIImageJPEGRepresentation(img, 1.0); 
    [newImageData writeToFile:filePath atomically:YES]; 
} 

Đó là nó. :-)

3

Trên cả hai giải pháp được đề cập đều hoạt động tốt để lấy đối tượng UIImage ra khỏi FBProfilePictureView. Chỉ có điều là, Bạn cần phải đặt một số chậm trễ trước khi để có được hình ảnh từ FBProfilePictureView. Giống như:

[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; 

} 

Kính trọng!

Aamir Ali - iOS Apps Developer

@Time Group (TGD)

0

Tôi đã tìm thấy giải pháp trên để được khá làm việc nhưng ở đây được cập nhật mã mà tôi tìm thấy nó dễ dàng hơn đi.

@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]; 
} 

Hy vọng điều này sẽ hữu ích. Ở đây tôi đã đặt 1 giây chậm trễ để chờ đợi cho hình ảnh hồ sơ để tải.

Các vấn đề liên quan