UIDynamicItem手动更新转换

xia*_*obo 7 objective-c ios uidynamicbehavior uikit-dynamics

我知道外部改变了center,bounds并且transformUIDynamicItem初始化后会被忽略.

但我需要手动更改transformUIView,在UIDynamicAnimator系统中.

每次我改变transform它,它将立即被覆盖.

那么任何想法?谢谢.

Rob*_*ier 15

每当你更改其中一个动画属性时,你需要打电话[dynamicAnimator updateItemUsingCurrentState:item]让动态动画师知道你做了它.它会更新它的内部表示以匹配当前状态.


编辑:我从下面的代码中看到你正在尝试修改比例.UIDynamicAnimator仅支持旋转和位置,不支持缩放(或任何其他类型的仿射变换).不幸的是transform,为了实现只是轮换而接管它.我认为这是一个错误UIDynamicAnimator(但后来我发现很多UIKit Dynamics的实现被归类为"错误").

你可以做的是修改你的界限(在通话之前updateItem...)并自己重绘.如果您需要仿射变换的性能,您有几个选择:

  • 将您的实际绘图逻辑移动到一个CALayer或子视图中并修改其比例(bounds如果您需要碰撞行为仍然有效,请更新您的匹配).
  • 而不是附加你的观点的行为,附加一个代理对象(只实现<UIDyanamicItem>NSObject),其通过变换改变你.然后,您可以将请求的变换与您自己的变换相结合.


小智 10

您还可以使用UIDynamicBehavior的.action属性在动画的每个刻度处设置所需的变换.

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];
attachment.damping = 0.8f;
attachment.frequency = 0.8f;
attachment.action = ^{
    CGAffineTransform currentTransform = item.transform;
    item.transform = CGAffineTransformScale(currentTransform, 1.2, 1.2)
};
Run Code Online (Sandbox Code Playgroud)

您需要在操作块中添加逻辑以确定何时应更改比例,以及确定何时更改,否则您的视图将始终为120%.