UIKit Dynamics 用碰撞改变视图框架

Posted

技术标签:

【中文标题】UIKit Dynamics 用碰撞改变视图框架【英文标题】:UIKit Dynamics change a view frame with collisions 【发布时间】:2017-07-27 00:05:47 【问题描述】:

我的项目有几个视图,这些视图在其父视图的中心受到径向重力的影响,并且有弹性碰撞,因此它们不会重叠。它工作得很好,但有时我需要调整视图的大小,当视图变大时,其他视图必须远离它,以便所有视图保持不重叠。 我希望碰撞行为能够意识到物体正在接触并将它们分开,但它似乎没有。

这是我现在正在尝试的:

[UIView animateWithDuration:0.5 animations:^
    view.frame = CGRectInset(view.frame, -30, -30);
 completion:^(BOOL finished) 
    [self.animator updateItemUsingCurrentState:view];
];

视图增长得很好,动画代理被告知动画已经恢复,但其他视图并没有移开。新放大的视图与其他视图重叠(或重叠,取决于 z 顺序)。

我尝试更改变换而不是框架 - 没有骰子。我尝试从所有行为中删除视图 - 没有骰子。我尝试从动画师那里删除一些和所有行为 - 没有骰子。我尝试在所有视图上调用updateItemUsingCurrentState: - 没有骰子。我需要一些骰子!

你能帮忙吗?谢谢...(swift-ies,随时回答是swift。我会翻译它)

【问题讨论】:

【参考方案1】:

感谢this post,我了解到所有包含被更改项目的行为都必须从动画制作器中移除,然后,在更改视图的属性后,应将行为添加回动画制作器。

我认为这很疯狂,但它奏效了。

[self.animator removeBehavior:self.behavior]; // for all behaviors that have view as an item

[UIView animateWithDuration:0.5 animations:^
    view.frame = CGRectInset(view.frame, -30, -30);
 completion:^(BOOL finished) 
    [self.animator updateItemUsingCurrentState:view];
    [self.animator removeBehavior:self.behavior];
];

【讨论】:

以上是关于UIKit Dynamics 用碰撞改变视图框架的主要内容,如果未能解决你的问题,请参考以下文章

UIKit Dynamics 碰撞 - 保持 Barriers 元素静止

iOS 力学动画生成器UIKit Dynamics 之碰撞效果解说

CollectionView + UIKit Dynamics 在 performBatchUpdates 上崩溃:

带有平移、旋转和捏合手势的 UIKit Dynamics

如何在应用 UIKit Dynamics 的重力时获取 UIView 的帧更新?

带有附件的 UIKit 动态行为平移不继续碰撞行为?