2016-03-02 67 views
1

Skew Example 嗨,歪斜的UIView沒有給視角,喚起注意保持和寬度

我想實現一個轉變,如圖像,但我只手上有類似的轉變但觀點(我不想)使用CGATransform3D。我如何使用objective-c來實現這一點?轉換後的圖像應該具有與原始圖像相同的高度和寬度,但基底會傾斜給定的角度。

在此先感謝您的幫助。

+0

您可以使用核心映像這一點。 –

回答

6

這是一個「剪切」或「傾斜」轉換。幸運的是,剪切變換是仿射變換,iOS支持在UIViewCALayer兩個層次上的仿射變換。然而,它沒有方便的功能來構建剪切變換,讓我們寫一個:

static CGAffineTransform affineTransformMakeShear(CGFloat xShear, CGFloat yShear) { 
    return CGAffineTransformMake(1, yShear, xShear, 1, 0, 0); 
} 

這不是很明顯正是xShearyShear意思。 xShear是y軸傾斜的角度的反正切,並且yShear是x軸傾斜角度的反正切值。這可能看起來倒退,但它具有您期望的視覺效果:非零值xShear向左或向右傾斜數字,而非零值向上或向下傾斜數字。

由於1的反正切值是π/ 4 = 45°,所以由affineTransformMakeShear(1, 0)返回的變換將矩形變爲左右邊緣爲45°的平行四邊形。

演示:

shear demo

注意,剪切兩軸可以是相同的,以旋轉和比例的組合。

這裏是我的演示代碼:

#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 
+0

非常感謝!這是真棒,比我想象的更容易! :D – user2248891

+0

@rob你有最好的演示傢伙:)如果有人將這些經典作品改爲Swift,那將是一件很酷的事情...... – Fattie