0

我像这样向动画师添加视图:

-(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]);
}

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

4

1 回答 1

3

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

当然,使这项工作的方法是给每个项目一个不与其他项目的起始位置重叠的起始位置,或者将它们全部添加到您现在添加它们的位置,只有一个彼此相隔几秒钟,因此最后一个可以不碍事。

于 2013-09-24T17:57:44.807 回答