【问题标题】:UIKit Dynamics change a view frame with collisionsUIKit Dynamics 用碰撞改变视图框架
【发布时间】: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。我会翻译它)

【问题讨论】:

    标签: ios objective-c swift uikit uikit-dynamics


    【解决方案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];
    }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      相关资源
      最近更新 更多