uitableviewからuitableviewにアイテムをドラッグアンドドロップする方法に関するチュートリアル[閉じた

StackOverflow https://stackoverflow.com/questions/3481858

質問

私はしばらくの間これに頭を叩いてきましたが、私はそれを理解しました。私はこのウェブサイトから多くの助けを得ているので、私はコミュニティに恩返しをしたいと思っています:)。

私は、あるuitableviewから別のuitableviewにアイテムをコピーしようとしており、これを行う方法についてWebで見た情報は、せいぜい大ざっぱでした。私はそれを自分で理解したので、私の小さなアーキテクチャについて説明します。

  • マスターuiview
    • uitableviewでuiview
      • カスタムuitableviewcell
        • コピーされるカスタムuiview(私の場合の人物)
    • uitableviewでuiview
      • カスタムuitableviewcell
        • コピーされるカスタムuiview(私の場合の人物)

私がuitableviewに持っている人物は、あるテーブルからドラッグアウトして別のテーブルにドラッグアウトしたいオブジェクトです。アイテムをテーブルからポップアウトし、1つの滑らかな動きでドラッグする方法を理解するのが最も難しいです。長い間、操作を実行するために2回のタッチが必要になります。

Personオブジェクトから始めて、これは画像を含む単純なオブジェクトです。ドラッグが行われているときに、人の中心位置を変更するために、独自のタッチスモーブメソッドを実装する必要がありました。

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if( m_moveable == YES ){
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:self.superview];

        if( 0 < location.x-50 && location.x+50 < 768 ){ 
            if( 0 < location.y-50 && location.y+150 < 1004 ){
                self.center = location;
            }
        }
    }
}

Person Objectのuser intercementEnabledフラグを初期化時にNOに設定して、テーブル内のクリックが人オブジェクトにキャッチされないようにします。その場合の人物は、目的を打ち負かすテーブル内を移動します。

次のオブジェクトは、私のカスタムuitableviewcellです。このオブジェクトは、ユーザーの最初のタッチをキャッチする責任があります。それがすべきことは、このタッチをキャッチし、人を「ポップ」することです。その人は、custom uitableviewcellに属するサブビューの1つです。

 - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *parent = self.superview.superview.superview;    

    Person *s = nil;
    for( UIView *child in self.subviews ){
        if( [child isKindOfClass:[Person class]] ){
            s = child;
            s removeFromSuperview];
            break;
        }        
    }

    if( s != nil ){
        self.userInteractionEnabled = NO;
        s.userInteractionEnabled = YES;
        UITableView *subParent = self.superview;   //EDIT #1
        subParent.scrollEnabled = NO;              //EDIT #1

        [parent addSubview:s];
        //[self touchesEnded:touches withEvent:event]; //EDIT #1
    }
}

上記の方法でuserInteractionEnabledフラグが反転することに注意することが重要です。タッチの前に、人のオブジェクトは人のタッチに対して「立ち入り禁止」です。カスタムセルが動きをキャッチした後、その人は親のビューに追加してアクティブ化することにより解放されます(userInteractionEnabled =はい)。その後、Person Objectは「Born」であり、それ自体で動きのタッチを処理できます。

これには、人オブジェクトが左上隅に点滅するが、すぐにユーザーの指まで落ちるという点で、1つのマイナーな不具合があります。

このデザインの最後の部分は、マスターUIViewが「タッチトランジション」を処理する必要があることです。ユーザーがテーブルに触れている場合、Personオブジェクトがポップアウトされると、アプリはテーブルからフォーカスを削除し、人オブジェクトに向ける必要があることを認識する必要があります。これが行われた方法は、マスターUiviewで最もヒットした方法が以下で過負荷になったことです。

- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *rv = nil;
    for(UIView *child in self.subviews){
        if( [child isKindOfClass:[Person class]] ){
            rv = child;
            child.center = point;
            break;
        }
    }
    if( rv == nil ){
        rv = [super hitTest:point withEvent:event];
    }   
    return rv;
}

このコードが機能する方法は、その人がテーブルから飛び出したとき、それに焦点を合わせたタッチがないということです。タッチは、その人がポップアウトされたUitableViewによって「所有」されます。最もヒットした方法は、そのタッチを再び焦点を合わせるための鍵です。定期的に、システムはどのuiviewがタッチの焦点であるかを確認します。最もヒットしたメソッドは、システムによって呼び出され、そのuiviewを識別します。その人がマスタービューに取り付けられているとき、このhitsedestestestest関数はすべてのサブビューを反復し、その人の存在を検出し、「支配的な」触れたオブジェクトとしてそれを返します。指の動きは、すぐに人に報告され、uitableviewには報告されません。

これは実装の勇気です。 uitableviewを「キャッチ」するには、移動オブジェクトが簡単になりました。試してみるために残します!ご質問がある場合は、投稿してください!

編集#1 Personオブジェクトをドロップすることは、私が思っていたよりも難しいことを証明しています:)。 UableViewがすべての動きのイベントを吸い込んでいるため、親が動き回っているときにUableViewがスクロールするのを防ぐために行を追加する必要がありました。
カスタムuitableviewcellクラスで触れられた関数が発火します。
MJ

役に立ちましたか?

解決

こんにちは、同じテーブルの別の行にuabitoviewで行のドラッグアンドドロップを作成することができました。移動するアイテム(テーブルから削除されなかった)を表すUIIMAGEVIEWを作成し、最前のUIViewに取り付けて、画面全体でドラッグ可能にしました。ここに私が直面した痛みについてのいくつかの投稿があります:

  1. UitableView:行を別のものにドラッグします
  2. UitableView:コンテンツビューをプログラムでスクロールします
  3. uitableview:カスタムジェスチャーは、それ以上スクロールしないようにします

これが役立つことを願っています^^

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top