Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone歪了一根线_Iphone_Calayer - Fatal编程技术网

iPhone歪了一根线

iPhone歪了一根线,iphone,calayer,Iphone,Calayer,我是一个初学者,我正在做一些练习来熟悉CALayer 我只是想知道如何“倾斜”(或倾斜)一个加莱尔45°的角度 谢谢。CALayers有一个属性,affineTransform,它采用。该文件明确指出: 缩放、旋转和平移是必需的 最常用的操作 受仿射变换支持,但 倾斜也是可能的 (显然是我的) 没有内置的帮助器来构造倾斜变换,但您可以执行以下操作(未测试): 然后,对于垂直方向与水平方向成45度角的倾斜: layer.affineTransform = CGAffineTransformMake

我是一个初学者,我正在做一些练习来熟悉CALayer

我只是想知道如何“倾斜”(或倾斜)一个加莱尔45°的角度


谢谢。

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);
}