为什么不将这些观点添加到此动画师中?

时间:2013-09-20 03:18:49

标签: ios dynamic uiview uikit

我正在向动画师添加视图,如下所示:

-(void)drawCellLikeViews{

    //2. Add Animator
    _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self];

    //Alloc array
    viewsArray = [[NSMutableArray alloc] initWithCapacity:6];

    for (int numberOfViews = 0; numberOfViews < 5; numberOfViews++) {
        //Create views
        UIView* cell = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
        cell.backgroundColor = [UIColor grayColor];
        [self addSubview:cell];

        [viewsArray addObject:cell];
    }


    //3. Add Gravity
    _gravity = [[UIGravityBehavior alloc] initWithItems:viewsArray];
    [_animator addBehavior:_gravity];

    //4. Add boundaries
    _collision = [[UICollisionBehavior alloc] initWithItems:viewsArray];
    _collision.translatesReferenceBoundsIntoBoundary = YES;
    [_animator addBehavior:_collision];


    //8. Add ItemProperties' Behaviors
    UIDynamicItemBehavior* itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:viewsArray];
    itemBehaviour.elasticity = 0.6;

    //9. itemBehaviour.action = ^{};
    [_animator addBehavior:itemBehaviour];

    NSLog(@"viewcount %d", [[self subviews] count]);
}

我只看到一个下拉到底部。

1 个答案:

答案 0 :(得分:3)

@HalR是正确的 - 您的观点 被添加到动画师中;它们只是同时以相同的起始属性添加,因此它们都将以完全相同的方式运行并显示为一个项目。是的,默认情况下,碰撞行为的模式是UICollisionBehaviorModeEverything,这意味着它的项目应该相互碰撞并与边界碰撞。然而,通过隐含UICollisionBehaviorModeEverything并将所有项目置于彼此之上,您创建了一个不可能的场景,其中您明确告诉每个项目的边缘重叠,但您已经告诉动画师他们不允许重叠。动画师在那时的行为是未定义的 - 我认为它只是忽略了你手动破坏的任何物理规则,但它可能比这更奇怪。在WWDC 2013 Session 206 (Getting Started with UIKit Dynamics)中,Apple一度表示“不要指望不可能”说“你可以创建没有解决方案的设置”,并以碰撞行为为例展示重叠项目。换句话说,他们看到了这一点,他们只是不希望你这样做。 ;)

当然,实现这项工作的方法只是为每个项目提供一个与其他项目的起始位置不重叠的起始位置,或者将它们全部添加到您现在添加它们的位置,彼此之间的距离只有几秒钟,因此最后一个可能会脱落。