我从如何将透视变换应用于UIView?的答案中复制了代码,以实现以下图像。然而,请注意分隔级别的锯齿状线条。有没有一种方法可以以一种反锯齿的方式执行这种透视变换?
编辑:我尝试了DarkDust在本帖子的评论中提供的解决方案。 没有一个似乎有效。 这是我的代码:
你在图片中看到的级别按钮都是
DarkDusk的另外两个评论专门提到了UIImages,但我没有使用它们。如果它们仍然适用,并且有人可以解释如何实现它们,我一定会尝试。
![enter image description here](https://istack.dev59.com/LriQv.webp)
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;
}
你在图片中看到的级别按钮都是
UIControl
的实例,它们是UIControl *levelView
的直接子视图。levelView
是正在进行变换的视图。DarkDusk的另外两个评论专门提到了UIImages,但我没有使用它们。如果它们仍然适用,并且有人可以解释如何实现它们,我一定会尝试。
layer.borderWidth = 1; layer.borderColor = [[UIColor clearColor] CGColor];
来成功。 - DarkDust