ios - 在不提供透视图并保持高度和宽度的情况下倾斜 UIView

标签 ios objective-c transform skew

Skew Example 嗨,

我正在尝试实现像图像中那样的转换,但我使用 CGATransform3D 只获得了类似的转换,但具有透视(我不想要)。我怎样才能使用 objective-c 实现这一点?转换后的图像应具有与原始图像相同的高度和宽度,但底部倾斜给定角度。

预先感谢您的帮助。

最佳答案

这是一种“剪切”或“倾斜”变换。幸运的是,剪切变换是仿射变换,iOS 在 UIViewCALayer 级别都支持仿射变换。然而,它没有构造剪切变换的便利函数,所以让我们写一个:

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

xShearyShear 的确切含义并不明显。 xShear 是 y 轴倾斜角度的正切,yShear 是 x 轴倾斜角度的正切。这可能看起来倒退,但它具有您期望的视觉效果:非零 xShear 使图形向左或向右倾斜,非零 yShear 使图形向上倾斜或向下。

由于 tan π/4 = 1(或者,如果您愿意,tan 45° = 1),affineTransformMakeShear(1, 0) 返回的变换将一个矩形变成一个平行四边形,其左边和右边缘为 π/4 弧度(或 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

关于ios - 在不提供透视图并保持高度和宽度的情况下倾斜 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758893/

相关文章:

iOS标签栏 Controller 在 Controller 顶部添加导航按钮

ios - 如何在 UIscrollView 中获取当前控制位置?

ios - 为 UICollectionView 部分设置背景颜色?

r - 如何根据R中的单行将行转换为列?

google-chrome - 转换错误 : scale and overflow: hidden in Chrome

iphone - iToast从不消失在我的iPhone应用程序中

ios - PFFacebookUtils.h (1.7.1) 导入不存在的 FacebookSDK.h

Objective-C:EXC_BAD_ACCESS并且没有响应

wpf - 如何围绕WPF中的特定点旋转,平移和缩放控件对象

ios - UITableView 静态单元格上的单元格始终为零