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 上崩溃: