【问题标题】:UIKit Dynamics with existing affine transform具有现有仿射变换的 UIKit Dynamics
【发布时间】:2013-10-12 19:59:03
【问题描述】:

我有一个具有一些比例转换的视图。当我在它上面应用一些 UIKit 动力学时,它会将它们归零。 /: 我怎样才能让现有的转换保持在视图上,同时让它跳来跳去? :P

谢谢。 :)

【问题讨论】:

  • 好问题,我整个晚上都在尝试破解这个问题:-) 当你有发现时请回复。
  • 我自己还没有遇到过这个问题,但是一个潜在的策略是使用一个额外的容器视图,你可以将 UIKit 动态应用到,然后你想要缩放的视图是那个容器的子视图视图(在其中居中),现在您应该能够将所需的任何变换应用到视图上,而不会干扰 UIKit 动态。

标签: ios uikit cgaffinetransform


【解决方案1】:

看看 UIDynamicAnimator 的updateItemUsingCurrentState

动态动画师会自动读取您添加到其中的每个动态项目的初始状态(位置和旋转),然后负责更新项目的状态。如果您在将动态项添加到动态动画制作器后主动更改它的状态,请调用此方法要求动画制作者读取并合并新状态。

因此,在将要转换的项目添加到动画师之后,只要您更改转换,只需立即致电 updateItemUsingCurrentState

id <UIDynamicItem> dynamicItem; // whatever your item is, probably a UIView
UIGravityBehavior *behavior = [[UIGravityBehavior alloc] initWithItems:@[dynamicItem]];
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; // or however you're getting your animator

[animator addBehavior:behavior];

view.transform = CGAffineTransformMakeScale(1.5, 1.5);
[animator updateItemUsingCurrentState:view];

【讨论】:

  • Tah,真不敢相信我错过了……谢谢伙计! :)
  • 这适用于scale吗?正如文档中提到的初始状态(位置和旋转),正如answer 所说,“UIDynamicAnimator 仅支持旋转和位置,不支持缩放(或任何其他类型的仿射变换)。”
【解决方案2】:

这是一个教程,http://www.raywenderlich.com/50197/uikit-dynamics-tutorial。 作者说,在动态控制下,我们不能使用变换来缩放你的对象。 希望这篇文章对你有所帮助。

【讨论】:

    【解决方案3】:

    我发现解决此问题的最简单方法是将UIKitDynamics 行为应用到容器视图并将缩放/变换应用到该容器内的子视图。

    通过这种方式,您还可以在应用动态行为的同时为变换设置动画。

    【讨论】:

      【解决方案4】:

      this 回答的启发,我有一个解决方案:更新动画每一帧的变换

      let attachment = UIAttachmentBehavior(item: item, attachedTo: item) // Workaround - attach the item to itself
      attachment?.action = { () in
          item.transform = item.transform.scaledBy(x: 1.5, y: 1.5)
      }
      
      animator.addBehavior(attachment)
      

      【讨论】:

      • 你能告诉我,什么是动画师。
      • 这是你的 UIDynamicAnimator 实例
      猜你喜欢
      • 2013-03-11
      • 2020-03-12
      • 2010-12-17
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多