2010-03-05 5 views
0

J'essaie d'ajouter une bordure courbe autour d'une image téléchargée et d'être affichée dans un UITableViewCell.SDK iPhone: Rendu d'une CGLayer dans un objet image

Dans la grande vue (par exemple une image sur l'écran) Je donne les résultats suivants:

productImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:product.image]]; 
[productImageView setAlpha:0.4]; 

productImageView.frame = CGRectMake(10.0, 30.0, 128.0, 128.0); 
CALayer *roundedlayer = [productImageView layer]; 
[roundedlayer setMasksToBounds:YES]; 
[roundedlayer setCornerRadius:7.0]; 
[roundedlayer setBorderWidth:2.0]; 
[roundedlayer setBorderColor:[[UIColor darkGrayColor] CGColor]]; 
[self addSubview:productImageView]; 

Dans la vue de table cellulaire, pour l'obtenir pour faire défiler rapidement, une image doit être dessiné dans le drawRect méthode d'un UIView qui est ensuite ajouté à une cellule personnalisée.

donc dans drawRect

- (void)drawRect:(CGRect)rect { 

... 

point = CGPointMake(boundsX + LEFT_COLUMN_OFFSET, UPPER_ROW_TOP); 

//CALayer *roundedlayer = [productImageView layer]; 
//[roundedlayer setMasksToBounds:YES]; 
//[roundedlayer setCornerRadius:7.0]; 
//[roundedlayer setBorderWidth:2.0]; 
//[roundedlayer setBorderColor:[[UIColor darkGrayColor] CGColor]]; 
//[productImageView drawRect:CGRectMake(boundsX + LEFT_COLUMN_OFFSET, UPPER_ROW_TOP, IMAGE_WIDTH, IMAGE_HEIGHT)]; 
//  

[productImageView.image drawInRect:CGRectMake(boundsX + LEFT_COLUMN_OFFSET, UPPER_ROW_TOP, IMAGE_WIDTH, IMAGE_HEIGHT)]; 

Alors cela fonctionne bien, mais si je retire le commentaire et essaie de montrer la couche CA arrondi le défilement va vraiment lent.

Pour résoudre ce problème, je suppose que je dois rendre ce contexte d'image dans un autre objet image, et le stocker dans un tableau, puis définir cette image comme quelque chose comme:

productImageView.image = (UIImage*)[imageArray objectAtIndex:indexPath.row]; 

Ma question est « Comment est-ce que je rends cette couche dans une image? " TIA.

+0

La solution est quelque chose comme ... UIGraphicsBeginImageContext (imageView.bounds.size); [self.layer renderInContext: UIGraphicsGetCurrentContext()]; UIImage * viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); mais cela nécessite que l'image soit d'abord affichée sur l'écran. Pas tout à fait ce que je cherche. – user279778

+0

Ceci est très proche de la réponse dont j'ai besoin ... http://blog.sallarp.com/iphone-uiimage-round-corners/ – user279778

Répondre

1

C'est ce que j'ai réussi à faire.

- (UIImage *)roundedImage:(UIImage*)originalImage 
{ 
    CGRect bounds = CGRectMake(0.0, 0.0, originalImage.size.width, originalImage.size.height); 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:originalImage]; 
    CALayer *layer = imageView.layer; 
    imageView.frame = bounds; 
    [layer setMasksToBounds:YES]; 
    [layer setCornerRadius:7.0]; 
    [layer setBorderWidth:2.0]; 
    [layer setBorderColor:[[UIColor darkGrayColor] CGColor]]; 
    UIGraphicsBeginImageContext(bounds.size); 
    [layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *anImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [imageView release]; 

    return anImage; 
} 

ensuite à l'échelle de l'image, j'ai trouvé dans l'exemple de chargement paresseux:

#define kAppIconHeight 48 

    CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight); 
UIGraphicsBeginImageContext(itemSize); 
CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
[image drawInRect:imageRect]; 
self.appRecord.appIcon = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
0

Vous êtes sur la bonne voie avec votre propre commentaire.

- (UIImage *)roundedImage:(UIImage*)originalImage; 
{ 
    CGRect bounds = originalImage.bounds; 
    CGImageRef theImage = originalImage.CGImage; 
    CALayer *roundedlayer = [CALayer layer]; 
    roundedlayer.position = CGPointMake(0.0f,0.0f); 
    roundedlayer.bounds = bounds; 
    [roundedlayer setMasksToBounds:YES]; 
    [roundedlayer setCornerRadius:7.0]; 
    [roundedlayer setBorderWidth:2.0]; 
    [roundedlayer setBorderColor:[[UIColor darkGrayColor] CGColor]]; 
    roundedlayer.contents = theImage; 

    UIGraphicsBeginImageContext(bounds.size);  // creates a new context and pushes it on the stack 

    CGContextBeginTransparencyLayerWithRect(UIGraphicsGetCurrentContext(), bounds, NULL); 
    CGContextClearRect(UIGraphicsGetCurrentContext(), bounds); 
    [roundedlayer drawInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *anImage = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext();  //releases new context and removes from stack 

    return anImage; 
} 

Je pré-rendu ces derniers et de les stocker dans votre réseau d'image afin qu'ils ne sont pas calculés au cours de votre drawRect, mais mis dans votre méthode

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

.

+0

Cool, c'est presque ça. Juste une chose de plus: réduire l'image. - (UIImage *) arrondiImage: (UIImage *) originalImage newWidth: (flottant) newWidth nouveauHauteur: (flottant) newHeight; CGRect bounds = CGRectMake (0.0.0.0, newWidth, newHeight); Hmmm ... pas sûr de toute la syntaxe. Vérification avec ce lien. Vous pouvez définir les limites comme vous l'avez indiqué dans votre commentaire ou utiliser la méthode [UIImage drawInRect:] lorsque vous le placez dans votre tableViewCell avec le commentaire suivant: http://www.gotow.net/creative/wordpress/?p=7 – user279778

+0

dimensions que vous désirez. Cela dépend si vous voulez une version arrondie à différentes échelles ailleurs. –

+0

Malheureusement, ce code ne fonctionne pas réellement.le compilateur se plaint à: CGRect bounds = originalImage.bounds; et roundedlayer.contents = theImage; Le premier que je suppose devrait être: CGRect bounds = CGRectMake (0.0, 0.0, originalImage.size.width, originalImage.size.height); comme pour la deuxième erreur, pas encore sûr. – user279778