众所周知,zPosition层中的层仅确定哪个层覆盖哪个层.无论是zPosition10还是1000,都不会影响其地位.
也就是说,除非我们使用CATransformLayer包含这些图层,否则zPosition这些图层将影响图层的位置.
但是,在iOS 5.1.1中运行的以下代码确实可以zPosition改变图层的位置...您可以在新的单视图应用程序中尝试它,并添加以下代码ViewController.m.如果zPositionof layer2更改为88to 188,我们可以看到图层相应地移动.所以CATransformLayer代码中没有; 它为什么会这样?(请引用Apple文档或任何参考).
另外相关的是,如果线self.view.layer.sublayerTransform = transform3D;被改变为self.view.layer.transform = transform3D; 那么zPosition将对位置没有影响.但根据苹果的文档,transform并且sublayerTransform只有在自我是否转化或者没有不同:
两层属性指定转换矩阵:
transform和sublayerTransform.由the指定的矩阵transform property应用于层及其子层相对于层的anchorPoint.[...]sublayerTransform属性指定的矩阵 仅应用于图层的子图层,而不是图层本身.
所以奇怪的是,为什么要改变它会导致self.view.layer像一个人CATransformLayer.
-(void) viewDidAppear:(BOOL)animated {
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = -1.0 / 1000;
transform3D = CATransform3DRotate(transform3D, M_PI …Run Code Online (Sandbox Code Playgroud) 我想画一个3D块!
使用2层,右侧的 3D看起来很好.看附图.
当我尝试重用相同的代码进行左侧的小修改!它看起来很奇怪.见下图,
如果我们能够改变视角,我觉得我们可以改进,但不知道如何实现这一点.
使用transform.m34的角度.任何帮助将不胜感激.
这是我正在使用的源代码.
// left Bar
/*{
CGFloat aViewWidth = 1000;
CAGradientLayer *blueLayer = [CAGradientLayer layer];
blueLayer.anchorPoint = P(0,0.5);
blueLayer.colors = @[
(id)aBarColor.CGColor,
(id)[UIColor blackColor].CGColor
];
blueLayer.startPoint = CGPointMake(0.0, 0.5);
blueLayer.endPoint = CGPointMake(1.5, 0.5);
blueLayer.frame = CGRectMake(125, 0, aViewWidth, 250);
blueLayer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI_2, 0.0f, 1.0f, 0.0f);
[baseLayer addSublayer:blueLayer];
CAGradientLayer *redLayer = [CAGradientLayer layer];
redLayer.colors = @[
(id)[UIColor whiteColor].CGColor,
(id)aBarColor.CGColor
];
redLayer.startPoint = CGPointMake(-10.0, 0.5);
redLayer.endPoint = CGPointMake(1.0, 0.5);
redLayer.anchorPoint = …Run Code Online (Sandbox Code Playgroud) 我搜索了谷歌和stackoverflow上的所有帖子,但我根本无法解决这个难题.我正在尝试重新创建现在着名的todo应用'Clear'在添加新任务时所做的效果.他们有某种动画,从顶部新任务出现在某种3D立方体效果中.他们的特殊之处在于,当你仔细观察时,左下角和下角总是停留在同一个地方.
现在我有以下内容:在点0,0设置了一个320x460的UIView,在点(0,-460)设置了一个320x460的UIView.我想要的是顶部的UIView与顶部的Clear相同的立方体效果.这是我到目前为止:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//startLoc is defined globally to remember the first position
startLoc = [[touches anyObject] locationInView:self];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint location = [[touches anyObject] locationInView:self];
float difference = location.y-startLoc.y;
if(diff > 0 && diff < 90)
{
//Init the transform
CATransform3D transform = CATransform3DIdentity;
transform.m34 = perspective;
//Rotate (radians is a degree-to radians function)
transform = CATransform3DRotate(transform, radians(90-diff), 1.0f, 0.0f, 0.0f);
//Also translate the view down
transform = CATransform3DTranslate(transform, 0.0f, 230+diff, 0.0f); …Run Code Online (Sandbox Code Playgroud) 我创建了一个" TransformView"子类UIView,以支持我在翻转动画中使用的双面视图.这已在其他帖子中提出,例如:
@interface TransformView : UIView
@end
@implementation TransformView
+ (Class)layerClass {
return [CATransformLayer class];
}
@end
Run Code Online (Sandbox Code Playgroud)
一切正常,但每次使用以下命令创建TransformView对象时都会收到警告:
TransformView *newTransformView=[[TransformView alloc] initWithFrame:frame];
Run Code Online (Sandbox Code Playgroud)
警告说:
- 在仅变换图层中更改属性不透明将不起作用
我想这个UIView类正在初始化不透明属性,这通常适用于CALayer但不是a CATransformLayer.
子类代码是不是很狡猾?如果是这样,你怎么能为翻转动画创建一个双面视图?
有关如何停止警告的任何想法?
我怀疑TransformView从一个nib文件创建而不是initWithFrame避免警告,但似乎很麻烦,为了避免警告必须这样做.
这是我的动画代码:
CGFloat zDistance = 850;
CGFloat scaleFactor = BACK_COVER_WIDTH / self.transformLayer.bounds.size.width;
CATransform3D rotation = CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0);
CATransform3D scale = CATransform3DMakeScale(scaleFactor, scaleFactor, 0.0);
CATransform3D transform = CATransform3DConcat(rotation, scale);
transform.m34 = 1.0 / -zDistance;
CGPoint location = CGPointMake(CGRectGetMidX(self.layer.frame), CGRectGetMidY(self.layer.frame));
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
self.transformLayer.transform = transform;
self.transformLayer.position = location;
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
self.transformLayer是一个CATransformLayer有两个子层,一个用于前面,一个用于后面(我正在创建一个"翻转"效果).但是,此代码只设置位置和变换而不动画.所以我认为也许transform不支持隐式动画,所以我把它拿出来并尝试设置位置,但这也没有动画(我知道肯定position支持隐式动画).
我做错了什么或者不CATransformLayer支持隐式动画?文档没有说它不支持它,所以我假设它.
编辑:这适用于Mac OS X,而不适用于iOS
我正在尝试将包含几个CAShapeLayers的CATransformLayer渲染到png文件中.我知道如何设置基本渲染,这确实有效.
虽然当我在CATransformLayer上调用renderInContext时,它会将所有内容展平为2D并完全忽略我的变换矩阵(旋转和/或透视).
如何将我的3d CATransformLayer及其所有CAShapeLayers呈现为PNG/UIImage?
在我看来,我被困在动画uiLabel.
实际上我只是想在圆形路径上设置标签/文本的动画.我已经在互联网上搜索了很多但是找不到任何好的教程或例子来做我喜欢的问题.我做了CAShapeLayer(圆圈)从0增加到它的最大值....
同样地,我希望我的标签/文本从圆形路径中的初始点开始移动,并在完成一个圆后回到其初始点.
希望我已经非常准确地解释了我的问题......如果有任何遗漏或不可理解的话.请问我
谢谢你的期待.