Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
Xcode 旋转视图以提供透视图_Xcode_Uiview_Rotation_Layer_Perspective - Fatal编程技术网

Xcode 旋转视图以提供透视图

Xcode 旋转视图以提供透视图,xcode,uiview,rotation,layer,perspective,Xcode,Uiview,Rotation,Layer,Perspective,我想更改我的Viewcontroller中的ui视图的透视图。我想我必须转换这个UIView层,但我不知道如何转换 我尝试了以下代码,但它不起作用 UIView *myView = [[self subviews] objectAtIndex:0]; CALayer *layer = myView.layer; CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; rotationAndPerspective

我想更改我的
Viewcontroller
中的
ui视图的透视图。我想我必须转换这个UIView层,但我不知道如何转换

我尝试了以下代码,但它不起作用

UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;
我还尝试了以下代码:

-(void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform.b = -0.1;
    transform.a = 0.9;
    CGContextConcatCTM(ctx,transform);
    // do drawing on the context
}
这也是:

CALayer *layerA = [[self.view.layer sublayers] objectAtIndex:0];


    layerA.transform = CATransform3DConcat(layerA.transform, CATransform3DMakeRotation(DEGREES_TO_RADIANS(45),1.0,0.0,0.0)
他们两个都不工作。如何更改
ui视图的透视图


换言之,我将举一个例子。这个示例代码是一个旋转饼图。我想改变它的视角,在x或z方向。

你的第一个解决方案对我有效。看起来是这样的:

如果你这边的代码不一样,你能展示你的整个类代码吗

编辑

好的,我已经重新配置了提供的代码示例,以展示它是如何实现的:

(此处下载更新的代码示例:)

看起来是这样的:

我只将转换应用于基本子视图。作为该视图的子视图的所有视图也将被转换。如果您希望相应的子视图具有不同的转换,这将更加困难,因为,您必须考虑父视图转换,以计算新的转换,这将变得非常困难

但是我做了一些简单的多视图级别的转换。例如-为了实现效果,视图将缩放、移动和旋转:

  • 我已将运动变换应用于parentView
  • 我已经将旋转变换应用于parentViews第一个子视图
  • 我已将缩放变换应用于parentViews first子视图
编辑

好的,我已经重新配置了提供的代码示例,以说明如何使车轮保持在变换位置:

(此处下载更新的代码示例: )

问题是——在本例中,我向轮子本身添加了转换——看起来轮子也是基于转换的。因此,当您触摸它时,它会替换现有的转换并应用它自己的转换(当用户滑动滚轮时旋转箭头)

因此,为了在与它交互时保持透视,我们需要另一个视图层

我创建了一个新视图(我们称之为父视图),并将轮子作为子视图添加到此视图中

然后我将转换应用于父视图,而不是轮子。而且它有效


我希望这有助于您了解更多关于转换的信息:)

在我的情况下,它不起作用。我有几个小视图在同一个视图中(作为容器视图)。当y尝试进行透视图更改时,小视图会彼此分离。我还想在另一个轴上旋转或透视,这是透视。通过改变m34参数和变换角度可以改变透视图。(选中最左箭头和最右箭头。其中一个看起来比另一个大-因此它是透视图。)另外-将背景颜色设置为父子视图,以查看它是否实际处于透视图中。很高兴我能提供帮助:)您应该查看-(void)touchesMoved:(NSSet*)toucheevent:(UIEvent*)事件-存储angleInRadians值,并将其与设置转换之前保存的值进行比较,以确定它是朝相反的方向还是朝正确的方向进行(然后相应地允许或不允许转换);看起来在一个方向上总是负面的。但经过进一步测试,我的建议似乎行不通。对不起,这不是我的强项。我建议创建一个新问题(以吸引更多的人),使用相同的项目链接、touchesModed的示例代码和问题-如何只允许在一个方向上进行转换。祝你好运