我想實現一個轉變,如圖像,但我只手上有類似的轉變但觀點(我不想)使用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
您可以使用核心映像這一點。 –