2012-08-09 16 views
16

Tutto sta funzionando bene con FBProfilePictureView ma ho bisogno di ottenere quell'immagine da FBProfilePictureView e trasformarla in un UIImage.Come posso convertire FBProfilePictureView in un UIImage?

Come devo fare?

Ho provato ad utilizzare questo:

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

Ma questo non funziona per la mia soluzione.

+0

Non sono sicuro del motivo per cui non hanno esposto la UIImage. Soluzione Lame, ma potresti semplicemente utilizzare l'API Graph e caricarla tramite URL? –

risposta

17

FBProfilePictureView è un UIView, questo UIView contiene un UIImageView, vale a dire la vostra immagine, è possibile ottenere l'UIImage da quella UIImageView:

profilePictureView è un FBProfilePictureView

UIImage *image = nil; 

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

EDIT: aggiungere un altro molto più velocemente ma fai la stessa cosa

__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

Restituisce nil –

+2

Yup ... restituisce nil. Funziona per chiunque? – Dev

+1

return nil se l'immagine non è ancora stata scaricata, è necessario impostare un ritardo o caricare UIImage quando l'immagine viene scaricata, altrimenti restituire nil, ma questo codice funziona – busta117

0

Ecco la soluzione.

passi:

Accertarsi che si è assegnato l'ID utente FB oggetto della classe "FBProfilePictureView" nel mio caso questo oggetto classe è "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]; 
} 

Ecco esso. :-)

3

Sopra entrambe le soluzioni menzionate funzionano bene per ottenere oggetto UIImage da FBProfilePictureView. L'unica cosa è, è necessario mettere un po 'di ritardo prima di ottenere l'immagine da FBProfilePictureView. Come:

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

} 

saluti!

Aamir Ali - iOS Apps Developer

@Time Group (TGD)

0

ho trovato sopra le soluzioni per essere abbastanza funziona, ma qui viene aggiornato codice che ho trovato più facile andare.

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

Spero che questo aiuti. Qui ho messo 1 secondo di ritardo per aspettare il caricamento dell'immagine del profilo.

Problemi correlati