2011-11-27 2 views
2

je dois tourner une UIImageView:ligne n'est pas lisse sur layer.border lorsque sa rotation

UIImageView *img = [[UIImageView alloc] init]; 
img.layer.borderWidth = 3.0; 
img.layer.borderColor = UIColorFromRGB(0xffffff).CGColor; 
img.layer.shadowColor = UIColorFromRGB(0x000000).CGColor; 
CATransform3D transform = CATransform3DMakeRotation ([Helper degreesToRadians:(5)], 1, 1, 1); 
img.layer.shadowRadius = 2.0; 
img.layer.shouldRasterize = YES; 

Le problème est que la frontière n'est pas lisse du tout:

Screen shot from the simluator

Répondre

3

Essayez ajouter une bordure transparente (1px peut être) autour de votre image. Voir ceci link. Vérifiez la section UIImage+Alpha dans cette page.

+0

Est-ce la seule option? N'y a-t-il pas un moyen de faire la rotation sans obtenir cette ligne crapy? – shannoga

+0

Le problème de base est que vous devez avoir terminé l'anti-alias. –

2

Je vois la plupart de la réponse pour ce problème est d'ajouter 1px frontière transparente, mais cela ne fonctionne que si nous n'utilisons aucune bordure autour UIImageView, si UIImageView lui-même a la frontière et nous la faisons pivoter alors la frontière n'est pas lisse. Je suis toujours en train d'essayer de trouver une solution à ce problème.

VOICI CE QUE JE FAIT DE FIXER CE NUMÉRO

UIImage *thumbnail = [photo thumbnailImage:thumbnailSize.width 
          transparentBorder:2 
           cornerRadius:0 
         interpolationQuality:kCGInterpolationHigh]; 

    CGPoint randomPoint = [self getRandomOriginPoint]; 

    UIImageView *thumbnailView = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, thumbnail.size.width, thumbnail.size.height)]; 

    [thumbnailView.layer setBorderWidth:2]; 
    [self setContentMode:UIViewContentModeCenter]; 
    [thumbnailView.layer setBorderColor:[UIColor whiteColor].CGColor]; 
    [thumbnailView.layer setShadowOffset:CGSizeMake(-3.0, 3.0)]; 
    [thumbnailView.layer setShadowRadius:3.0]; 
    [thumbnailView.layer setShadowOpacity:1.0]; 
    thumbnailView.layer.shouldRasterize = YES; 

je UIImage + Resize.h de here pour obtenir l'image miniature dans mon code, donc avec ce même après que vous faites pivoter l'image avec un angle de la frontière aura l'air parfaitement bien!

+0

J'ai utilisé cette réponse pour résoudre mon problème, puis j'ai re-répondu avec une solution qui fournit moins d'hypothèses. C'est vraiment la rastérisation qui le résout. –

1

Sans avoir à utiliser des catégories, la solution qui a fait le plus petit nombre de présomptions

#import <QuartzCore/QuartzCore.h> 

Nous utiliserons la variable suivante

UIView *myView; 

Cela a été confirmé travailler sur UIImageViews/UIViews de tous les types

myView.layer.shouldRasterize = YES; //the single line that solved this problem from the above 

Vous ne devriez pas avoir besoin d'ajouter une bordure de n'importe quel type pour ceci pour fonctionner.

CATransform3D rotate = CATransform3DIdentity; 
myView.layer.shouldRasterize = YES; 
rotate = CATransform3DRotate(rotate,M_PI_4/8,0.0,0.0,1); 
myView.layer.transform = rotate; 

Remarque: Cette réponse est fournie pour consolider les informations en une seule réponse qui supprime certaines des autres exigences. Dans cet exemple, j'utilise M_PI_4/8 car c'est un bon angle de vue si vous avez une sorte de vue que vous implémentez.