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

一番下にドロップダウンが1つしか見えません。

4

1 に答える 1

3

@HalR は正しいです。ビューアニメーターに追加されています。それらはすべて同じ開始属性で同時に追加されるため、すべてまったく同じように動作し、1 つのアイテムとして表示されます。はい、デフォルトでは、衝突動作のモードは です。これはUICollisionBehaviorModeEverything、アイテムが互いに衝突し、境界と衝突することを意味します。しかし、すべてのアイテムを重ねて配置することをほのめかしUICollisionBehaviorModeEverythingて、各アイテムの端をオーバーラップするように明示的に指示し、アニメーターには許可されていないことを伝えるという不可能なシナリオを作成しました。重なる。その時点でのアニメーターの動作は定義されていません。手動で破った物理法則を無視しているだけだと思いますが、それよりもはるかに奇妙になる可能性があります。のWWDC 2013 セッション 206 (Getting Started with UIKit Dynamics)で、Apple はある時点で「不可能なことを期待しないでください」と述べ、「解決策のないセットアップを作成することができます」と述べ、例として衝突動作が設定された重複アイテムを示しています. 言い換えれば、彼らはこれが来るのを見て、あなたにそれをして欲しくないだけなのです。;)

もちろん、これを機能させる方法は、各アイテムに他のアイテムの開始位置と重ならない開始位置を与えるか、現在追加している場所にすべてを追加することです。互いに数秒離れているため、最後のものが邪魔にならないようにします。

于 2013-09-24T17:57:44.807 に答える