【问题标题】:Applying multiple transforms to a UIView / CALayer将多个转换应用于 UIView / CALayer
【发布时间】:2010-11-09 19:45:21
【问题描述】:

对 UIView 及其对应的 CALayer 应用多个转换是否有任何问题?

具体来说,您能否“混合搭配”CATransform3D 和 CGAffineTransforms 而不会遇到问题?

在同时动画另一个变换变化的同时直接设置一些变换是否有任何问题?

是否有任何“规则”来说明如何做到这一点,或者有任何设计模式?

【问题讨论】:

    标签: iphone cocoa-touch uikit core-animation


    【解决方案1】:

    我意识到这并不能完全回答这个问题(或接近),但如果您只使用 CGAffineTransforms,您可以使用 CGAffineTransformConcat() 来组合多个转换。

    只要您正确连接转换,当某些转换为动画而其他转换不为动画时,这将正常工作。当您还进行图层转换时,我不知道这是如何工作的。

    【讨论】:

    • CGAffineTransformConcat 适用于两个转换,但对于三个或更多转换来说有点尴尬。看到this answer做两个以上。
    【解决方案2】:

    pix0r 是对的,但这里有更多关于此的信息。 The official docs for CGAffineTransformConcat().

    另外,这里有一个简单的例子:

    // Rotate 45 degrees
    CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180));
    // Move to the left
    CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0);
    // Apply them to a view
    self.view.transform = CGAffineTransformConcat(translate, rotate);
    

    【讨论】:

    • 不应该是 CGAffineTransformConcat(rotate, translate),因为点是行向量?
    • 我也是这么想的,但似乎应该先应用翻译。旋转是围绕平移坐标系的中心,但是如果先旋转再平移,平移是沿着旋转坐标系的轴。
    【解决方案3】:

    Swift 3 和 4 的语法略有变化。改编自 @whitehawk 的回答:

    // Rotate 45 degrees
    var rotate = CGAffineTransform(rotationAngle: 45 * (.pi / 180))
    // Move to the left
    var translate = CGAffineTransform(translationX: -50, y: 0)
    // Apply them to a view
    self.view.transform = translate.concatenating(rotate)
    

    【讨论】:

      【解决方案4】:

      我成功地同时平移和旋转了一个imageView,这样:

      float scaleFactor_x   = 2.8;
      float scaleFactor_y   = 2.45;
      imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
      CGAffineTransform scaleTrans  = CGAffineTransformMakeScale(scaleFactor_x, scaleFactor_y);
      CGAffineTransform translateTrans  = CGAffineTransformMakeTranslation(0, 55);
      imgBigBallBasic.contentMode = UIViewContentModeScaleAspectFit;
      imgBigBallBasic.transform = CGAffineTransformConcat(translateTrans, scaleTrans);
      imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100);
      imgBigBallBasic.center = [[imgBigBallBasic window] center];
      [UIView commitAnimations];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多