4

UIImageView's内に複数ありますUIView。これらUIImageViewsは変換されました。

ジェスチャがいずれか 1 つに適用されるとUIImageView's、重なっている imageView は、UIImageView'sフレームの外側に移動して画像全体が表示されるように移動する必要があります (これはすべて、アニメーション化された方法で行われます)。

また、画像が変換されているため、フレームのプロパティを使用できないことに注意してください。

現在、使用してCGRectIntersectsRectいますが、望ましい効果が得られません。

4

2 に答える 2

3

多くの苦労の後、最終的にこのアルゴリズムで望ましい結果を達成しました。

  • 重なりのリストを計算UIImageView'sし、配列に格納します。私はCGRectIntersectsRectこれに使用しています。

    注 : これにはUIImageView、ジェスチャが適用された (ターゲット ImageView など) も含まれます。

  • これらの重複する UIImageView のそれぞれについて、次の手順を実行します。

    1) 重なり合う ImageView とターゲット ImageView の間の角度を計算します。これにより、重複する ImageView をシフトする方向がわかります。

    2) 同じ角度を維持するように、オーバーラップする ImageView を一定の距離 (len など) だけシフトします。方向は、ターゲットの ImageView から離れるようにする必要があります。

    3) Sin/Cos 関数を使用して、新しい x、y 座標を計算できます。

    x = start_x + len * cos(角度);
    y = start_y + len * sin(角度);

    注: 中心がターゲット ImageView の中心よりも小さい ImageView の場合は、値を減算する必要があります。

    4) オーバーラップする ImageView を新しく計算された中心に移動します。

    5) ビューが交差しなくなるまで移動を続けます。

  • コードを添付しています。お役に立てば幸いです。

    -(void)moveImage:(UIImageView *)viewToMove fromView:(UIImageView *)imageToSendBack
    {

            CGFloat angle = angleBetweenLines(viewToMove.center, imageToSendBack.center);
    
            CGFloat extraSpace = 50;
    
            CGRect oldBounds = viewToMove.bounds;
            CGPoint oldCenter = viewToMove.center;
    
            CGPoint shiftedCenter;
    
            while(CGRectIntersectsRect(viewToMove.frame,imageToSendBack.frame))
            {
                 CGPoint startPoint = viewToMove.center;
    
                shiftedCenter.x = startPoint.x - (extraSpace * cos(angle));
    
                if(imageToSendBack.center.y < viewToMove.center.y)
                    shiftedCenter.y = startPoint.y + extraSpace * sin(angle);
                else
                    shiftedCenter.y = startPoint.y - extraSpace * sin(angle);
    
    
                viewToMove.center = shiftedCenter;
    
            }
            viewToMove.bounds = oldBounds;
            viewToMove.center = oldCenter;
    
            [self moveImageAnimationBegin:viewToMove toNewCenter:shiftedCenter];
        }
    
于 2012-05-17T10:33:30.320 に答える
0

私はこれを試しませんでしたが、次のようにします:

CGRectIntersectsRect から bool を取得した後、この重なっている UIImageView の x と y に幅と高さを掛けます。

また、変換を変更した後はフレーム プロパティを使用できないため、最大回転量を得るには、幅と高さに 1.5 を掛ける必要があります。

警告: transform プロパティが恒等変換でない場合、このプロパティの値は定義されていないため、無視する必要があります。

これにより、一部のビューが他よりも移動する可能性がありますが、すべてのビューが UIImageView のフレームの外に移動することは確実です。

試してみてうまくいかない場合は、コードを投稿してください。私がお手伝いします。

編集: x、y が UIImageView の x、y より小さいビューの場合、オフセットを減算する必要があります。

于 2012-05-16T14:13:22.453 に答える