2011-07-20 10 views
1

ビューでユーザーがタッチしたポイントまたは移動ポイントに応じてサブビューを非常に高速に削除する方法ユーザーにタッチポイントを与え、ビュー内のポイントを移動でき、 [subview removefromsuperview];を使用して、ユーザがタッチしたポイントに従ったサブビュー。ユーザーは、いくつかのサブビューを削除取得し、ユーザーがexactly.iが私のコードの一部がユーザーが非常に速く動いたときにスーパービューからサブビューを削除する

`

下回って配置しています削除取得サブビューゆっくり動くdeleted.If画像の一部を取得していない非常に高速に移動

-(void)deleteSubView:(CGPoint)userCurrentPoint{ 

for(int i=0;i<[subviews count];i++){ 

if (CGRectContainsPoint([[subviews objectAtIndex:i] CGRectValue], userCurrentPoint)) { 

       [[superview viewWithTag:i ] removeFromSuperview]; 



    } 
} 

`

速いpoints.iがあなたの提案を必要とする移動するユーザーと応じたサブビューを削除する方法はあります。それはあなたの列挙:)

を行うことはありません おかげで、すべての

+0

が役に立つかもしれませんが...論理的には見えますが... – Suny

+0

それは同じntgの大きな違いです。 – ajay

答えて

2

あなたのヘッダファイルにこれを入れて:

@interface YourView : UIView 

@property (nonatomic, assign) CGPoint lastTouchLocation; 
@end 

をこれは実装する必要があります:

@implementation YourView 
@synthesize lastTouchLocation; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 

    self.lastTouchLocation = [[touches anyObject] locationInView:self]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 

    CGPoint oldLocation = self.lastTouchLocation; 
    CGPoint newLocation = [[touches anyObject] locationInView:self]; 

    for (UIView *subview in self.subviews) 
    { 
     if (LineIntersectsRect(oldLocation, newLocation, subview.frame)) 
     { 
      [subview removeFromSuperview]; 
     } 
    } 

    self.lastTouchLocation = newLocation; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent:event]; 

    self.lastTouchLocation = CGPointZero; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 

    self.lastTouchLocation = CGPointZero; 
} 
@end 

これが何をするか:私たちは最後の間の線は、タッチと電流を受けたか否かをチェック1つはサブビューのフレームと交差します。どうして? deanWombourneの答えを参照してください。

ここでは、もともとhabjanによって交差コードがあります。ヘッダーにも入力する必要があります。

static inline BOOL LineIntersectsLine(CGPoint l1p1, CGPoint l1p2, CGPoint l2p1, CGPoint l2p2) 
{ 
    CGFloat q = (l1p1.y - l2p1.y) * (l2p2.x - l2p1.x) - (l1p1.x - l2p1.x) * (l2p2.y - l2p1.y); 
    CGFloat d = (l1p2.x - l1p1.x) * (l2p2.y - l2p1.y) - (l1p2.y - l1p1.y) * (l2p2.x - l2p1.x); 

    if(d == 0) 
    { 
     return false; 
    } 

    CGFloat r = (q/d); 
    q = (l1p1.y - l2p1.y) * (l1p2.x - l1p1.x) - (l1p1.x - l2p1.x) * (l1p2.y - l1p1.y); 

    CGFloat s = (q/d); 

    if((r < 0) || (r > 1) || (s < 0) || (s > 1)) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

static inline BOOL LineIntersectsRect(CGPoint p1, CGPoint p2, CGRect r) 
{ 
    if (CGRectContainsPoint(r, p1) || CGRectContainsPoint(r, p2)) 
    { 
     return YES; 
    } 
    else 
    { 
     CGPoint topLeft = CGPointMake(r.origin.x, r.origin.y); 
     CGPoint topRight = CGPointMake(r.origin.x + r.size.width, r.origin.y); 
     CGPoint bottomLeft = CGPointMake(r.origin.x, r.origin.y + r.size.height); 
     CGPoint bottomRight = CGPointMake(r.origin.x + r.size.width, r.origin.y + r.size.height); 

     return (LineIntersectsLine(p1, p2, topLeft, topRight) || 
       LineIntersectsLine(p1, p2, topRight, bottomRight) || 
       LineIntersectsLine(p1, p2, bottomRight, bottomLeft) || 
       LineIntersectsLine(p1, p2, bottomLeft, topLeft)); 
    } 
} 
+0

あなたの答えのためのジェノクスありがとう私は書かれた道をチェックします.. – ajay

+0

コード上の壊れたジェノクスは私のために働いていません..他のものを探しています – ajay

+0

あなたのプロジェクトのZIP形式のバージョンを投稿できますか?私はそれをあなたのために働かせます。 ;) –

1

は、ユーザーがすぐに自分の指を移動した場合、あなたは彼らが触れたすべてのピクセルのリストを取得していない、あなたはそれらのいくつかのを取得します。彼らが十分に速く動くのであれば、開始点と終了点しか得られないかもしれません。

あなたがちょうど彼らの指が、あなたはサブビューが最後のイベントの間でタッチされているうちに働かなければならないにドラッグされたポイントを使用することはできません

この1 :)の間に線を引くように、それの

考えます開始点と終了点、およびどのサブビューがその行と重なっているかを調べる。

+0

これはちょうど私がやったことです。しかし、あなたは一秒早くなりました!畜生。 –

+0

本当の意味では真実ですが、あなたは本当のコードを自分の答えに入れることができました - 私は彼に自分のためにそれを働かせるようにしました;) – deanWombourne

+0

私は彼にそのような線間交差を検出する方法を示したかった。良いコードなしで! : –

0

私が正しくあなたの質問を理解していれば、あなたは彼があなたの視野全体に指をドラッグするユーザーが触れるすべてのサブビューを削除したいです。

あなたの問題は、touchesMoved:withEvent:が限られた頻度で発生することです。ユーザーが触れるすべてのピクセルについて発射することは保証されていません。その結果、ユーザが指をすばやく動かすと、touchesMoved:withEventに報告されたポイント間に隙間ができます。ユーザーが指をすばやく動かすと、これらのギャップは十分に大きくなり、一部のサブビューを完全にスキップできます。

この問題を解決するには、前のポイントの位置を覚えておいて、前のポイントと現在のポイントによって形成された線分をテストして、それがサブビューのフレームと交差するかどうかを調べる必要があります。効率的なアルゴリズムは、How to test if a line segment intersects an axis-aligned rectange in 2D?

関連する問題