我想实现一个转变,如图像,但我只手上有类似的转变但观点(我不想)使用CGATransform3D。我如何使用objective-c来实现这一点?转换后的图像应该具有与原始图像相同的高度和宽度,但基底会倾斜给定的角度。
在此先感谢您的帮助。
我想实现一个转变,如图像,但我只手上有类似的转变但观点(我不想)使用CGATransform3D。我如何使用objective-c来实现这一点?转换后的图像应该具有与原始图像相同的高度和宽度,但基底会倾斜给定的角度。
在此先感谢您的帮助。
这是一个“剪切”或“倾斜”转换。幸运的是,剪切变换是仿射变换,iOS支持在UIView
和CALayer
两个层次上的仿射变换。然而,它没有方便的功能来构建剪切变换,让我们写一个:
static CGAffineTransform affineTransformMakeShear(CGFloat xShear, CGFloat yShear) {
return CGAffineTransformMake(1, yShear, xShear, 1, 0, 0);
}
这不是很明显正是xShear
和yShear
意思。 xShear
是y轴倾斜的角度的反正切,并且yShear
是x轴倾斜角度的反正切值。这可能看起来倒退,但它具有您期望的视觉效果:非零值xShear
向左或向右倾斜数字,而非零值向上或向下倾斜数字。
由于1的反正切值是π/ 4 = 45°,所以由affineTransformMakeShear(1, 0)
返回的变换将矩形变为左右边缘为45°的平行四边形。
演示:
注意,剪切两轴可以是相同的,以旋转和比例的组合。
这里是我的演示代码:
#import "ViewController.h"
@interface ViewController()
@property (strong, nonatomic) IBOutlet UIView *shearedView;
@property (strong, nonatomic) IBOutlet UISlider *verticalShearSlider;
@property (strong, nonatomic) IBOutlet UISlider *horizontalShearSlider;
@property (strong, nonatomic) IBOutlet UILabel *verticalShearLabel;
@property (strong, nonatomic) IBOutlet UILabel *horizontalShearLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self updateAppearance:nil];
}
static CGAffineTransform affineTransformMakeShear(CGFloat xShear, CGFloat yShear) {
return CGAffineTransformMake(1, yShear, xShear, 1, 0, 0);
}
- (IBAction)updateAppearance:(id)sender {
CGFloat xShear = self.horizontalShearSlider.value;
CGFloat yShear = self.verticalShearSlider.value;
self.shearedView.transform = affineTransformMakeShear(xShear, yShear);
self.horizontalShearLabel.text = [NSString stringWithFormat:@"%.2f", xShear];
self.verticalShearLabel.text = [NSString stringWithFormat:@"%.2f", yShear];
}
@end
非常感谢!这是真棒,比我想象的更容易! :D – user2248891
@rob你有最好的演示家伙:)如果有人将这些经典作品改为Swift,那将是一件很酷的事情...... – Fattie
您可以使用核心映像这一点。 –