iPhone歪了一根线
我是一个初学者,我正在做一些练习来熟悉CALayer 我只是想知道如何“倾斜”(或倾斜)一个加莱尔45°的角度iPhone歪了一根线,iphone,calayer,Iphone,Calayer,我是一个初学者,我正在做一些练习来熟悉CALayer 我只是想知道如何“倾斜”(或倾斜)一个加莱尔45°的角度 谢谢。CALayers有一个属性,affineTransform,它采用。该文件明确指出: 缩放、旋转和平移是必需的 最常用的操作 受仿射变换支持,但 倾斜也是可能的 (显然是我的) 没有内置的帮助器来构造倾斜变换,但您可以执行以下操作(未测试): 然后,对于垂直方向与水平方向成45度角的倾斜: layer.affineTransform = CGAffineTransformMake
谢谢。CALayers有一个属性,
affineTransform
,它采用。该文件明确指出:
缩放、旋转和平移是必需的
最常用的操作
受仿射变换支持,但
倾斜也是可能的
(显然是我的)
没有内置的帮助器来构造倾斜变换,但您可以执行以下操作(未测试):
然后,对于垂直方向与水平方向成45度角的倾斜:
layer.affineTransform = CGAffineTransformMakeSkew(1.0f);
您可以这样做,但必须处理
层
的转换
属性,这是一个结构CATTransformM3d
。你需要做一些向量数学来做到这一点,就像你所说的。有关详细信息,请参阅中的计算变换矩阵(…)
函数
您将需要执行以下操作:
CGRect r = layer.bounds;
layer.transform = compute_transform_matrix(r.origin.x, r.origin.y, r.size.width, r.size.height,
r.size.height, r.origin.y, r.size.width + r.size.height, r.origin.y,
r.origin.x, r.origin.y + r.size.height, r.size.width, r.origin.y );
检查一下我的数学。这应该是正确的。Calayer可以使用矩阵运算进行变换。倾斜变换由以下矩阵表示 因此,如果要沿x轴进行倾斜变换,可以使用以下示例
CALayer* layer = [CALayer layer];
layer.frame = CGRectMake(50,50,50,50);
layer.backgroundColor = [UIColor blueColor].CGColor;
[self.window.layer addSublayer:layer];
float theta = -45.0f;
CGAffineTransform t = CGAffineTransformIdentity;
t.b = tan(theta*M_PI/180.0f);
layer.transform = CATransform3DMakeAffineTransform(t);
下面的示例将生成一个如下所示的层
关于变换的工作原理有很多参考资料,要真正理解它们需要一些时间(至少对我来说是这样!),这里有一些直截了当的代码,可以确保指明变换应用于哪个轴
/*!
* Positive `skewX` creates a shift to the left.
* Negative `skewX` creates a shift to the right.
*
* `skewX` is NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkewX(CGFloat skewX)
{
return CGAffineTransformMakeSkew(skewX, 0.0f);
}
/*!
* Positive `skewY` creates a shift to the bottom.
* Negative `skewY` creates a shift to the top.
*
* `skewY` is NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkewY(CGFloat skewY)
{
return CGAffineTransformMakeSkew(0.0f, skewY);
}
/*!
* Positive `skewX` creates a shift to the left.
* Negative `skewX` creates a shift to the right.
*
* Positive `skewY` creates a shift to the bottom.
* Negative `skewY` creates a shift to the top.
*
* The skew values are NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkew(CGFloat skewX, CGFloat skewY)
{
return CGAffineTransformMake(1.0f, skewY, skewX, 1.0f, 0.0f, 0.0f);
}
你的3个答案对我非常有用,这让我可以继续练习!!我在找谭(θ*M_π/180.0f)。谢谢。你需要将其中一个答案标记为正确。
/*!
* Positive `skewX` creates a shift to the left.
* Negative `skewX` creates a shift to the right.
*
* `skewX` is NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkewX(CGFloat skewX)
{
return CGAffineTransformMakeSkew(skewX, 0.0f);
}
/*!
* Positive `skewY` creates a shift to the bottom.
* Negative `skewY` creates a shift to the top.
*
* `skewY` is NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkewY(CGFloat skewY)
{
return CGAffineTransformMakeSkew(0.0f, skewY);
}
/*!
* Positive `skewX` creates a shift to the left.
* Negative `skewX` creates a shift to the right.
*
* Positive `skewY` creates a shift to the bottom.
* Negative `skewY` creates a shift to the top.
*
* The skew values are NOT pixel based. Test values of 0.0f - 1.0f.
*/
CGAffineTransform CGAffineTransformMakeSkew(CGFloat skewX, CGFloat skewY)
{
return CGAffineTransformMake(1.0f, skewY, skewX, 1.0f, 0.0f, 0.0f);
}