5

正方形に分割されたカスタム ビューを必要とするプロジェクトに取り組んでいます。その上に別のビューをドラッグできる必要があり、そのオブジェクトをドロップすると、グリッドの正方形にスナップします。また、グリッド内のすべての正方形を反復処理して、オブジェクトがその特定のグリッド スクエア内にあるかどうかを判断できるようにする必要もあります。

これは少し一般的な質問だと思いますが、どこから始めればよいか、参照用に既に存在する可能性のあるクラスまたはフレームワークについての方向性を探しているだけです。どんな方向性でも大歓迎です。ありがとう。

4

2 に答える 2

2

質問 #1:ユーザーが別のビューをその上にドラッグできるようにする必要があります。そのオブジェクトをドロップすると、グリッドの正方形にスナップします。

UIView をドラッグしているとしましょう。UIView の touchesEnded では、UIView の x 座標と y 座標の中心値を含む center プロパティを使用し、それを関数に渡して、どのグリッド スクエアの内側にあるかをテストします。

これは次のようになります (UIView の名前が dragingView であると仮定します):

for (CGRect gridSquare in gridArray) {
    if (CGRectContainsPoint(gridRect, draggingView.center)) {
        // Return the gridSquare that contains the object
    }
}

gridArray とは何なのか疑問に思っている方のために説明すると、これはゲーム ボードを構成するすべてのグリッド スクエアの配列です。これを作成するのに助けが必要な場合は、私に知らせてください。

質問 2:ユーザーは、グリッド内のすべての正方形を繰り返し処理し、オブジェクトがその特定のグリッド 正方形内にあるかどうかを判断できる必要があります。

上記に沿って進めることができれば、これは非常に簡単です。グリッドの四角形を繰り返し処理しているときに、gridSquare の原点値を使用して、dragView サブビューのいずれかが同じ原点を持つかどうかを確認できます。これを使用すると、特定の正方形の内側にある UIView を返すことができます。下記参照:

- (UIView *)findViewInSquare {
    for (CGRect rect in gridArray) {
        for (UIView *view in [self.view subViews]) {
            if (CGPointEqualToPoint(view.frame.origin, rect.origin)) {
                return view;   // Returns the view in the grid square
            }
        }
    }
    return nil;
}

説明が必要な場合はお知らせください。

于 2013-08-07T22:28:32.097 に答える
0

ビューのレイアウトに多くの柔軟性を提供し、ビューの挿入/削除のアニメーション化をサポートするため、おそらく UICollectionView から始めることになります。

ユーザーが挿入したいビューを解放するとき、おそらく UICollectionViewDataSource が必要な場所に新しいセルを提供し (セルを透明にし)、そのフレームを取得する必要があります。次に、アニメーションを使用してビューをセルの位置に移動し、アニメーションの完了ハンドラーでそれをセルのサブビューとして追加します。

以下のハンドウェーブ疑似コード:

UIView * viewToDrop; // your view being dropped
NSIndexPath * indexPathOfInsertedCell; // figure this out... not sure exactly how you would calculate this--you might need to interrogate the UICollectionViewLayout
UICollectionView * collectionView; // your collection view
UICollectionViewCell * dropCell = [collectionView cellForItemAtIndexPath:indexPathOfInsertedCell];
[UIView animateWithDuration:0.25 animations:^{
    CGFloat dx = viewToDrop.frame.origin.x - dropCell.frame.origin.x;
    CGFloat dy = viewToDrop.frame.origin.y - dropCell.frame.origin.y;
    viewToDrop.transform = CGAffineTransformMakeTranslation(dx, dy);
} completion:^(BOOL finished) {
    [dropCell addSubview:viewToDrop];
}];
于 2013-08-07T21:27:47.640 に答える