Skip to main content

Anti-aliasing lines when using CATransform3DRotate



I copied the code from the answer to How do I apply a perspective transform to a UIView? in order to achieve the following image. Note, however, the jagged lines separating the levels. Is there away to perform this kind of perspective transformation in a way that anti-aliases these jagged lines?





enter image description here





Edit I've tried the solutions offered by DarkDust in the comments on this post. None seem to work. Here's my code:







levelView = [[UIControl alloc] initWithFrame:CGRectMake(100, 60, 160, 230)];

[self addSubview:levelView];

levelView.transform = CGAffineTransformScale(self.transform, .8, .8);



CALayer *layer = levelView.layer;



//DarkDust's 2nd comment

layer.borderWidth = 1;

layer.borderColor = [[UIColor clearColor] CGColor];



CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;

rotationAndPerspectiveTransform.m34 = 1.0 / 1000;

rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);

layer.transform = rotationAndPerspectiveTransform;



for (NSString *ID in [NSArray arrayWithObjects:@"Level 1", @"Level 2", @"Level 3", @"Level 4", @"Level 5", nil]) {



//Note the offset of 5 from the superview in both X and Y directions. This addresses DarkDusk's first comment

UIControl *ctrl = [[UIControl alloc] initWithFrame:CGRectMake(5, y + 5, levelView.frame.size.width, 220/5)];

[levelView addSubview:ctrl];

[ctrl addTarget:self action:@selector(languageSelected:) forControlEvents:UIControlEventTouchDown];

[self styleEnabled:ctrl];



UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(13, 0, ctrl.frame.size.width - 13, ctrl.frame.size.height)];

[ctrl addSubview:label];

label.text = ID;

label.font = [UIFont systemFontOfSize:20];

label.textColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:.8];

label.backgroundColor = [UIColor clearColor];



y += ctrl.frame.size.height;

}







The level buttons you see in the image are all instances of UIControl , and they are the direct subviews of UIControl *levelView . levelView is the one that is getting transformed.





The other two of DarkDusk's comments refer specifically to UIImages, which I am not using. If they are still applicable and someone can explain how to implement them, I'll certainly give them a shot.


Comments