0

次を含む画面があります。

  • UIView A
  • UIView B を含む UIScrollView

UIScrollView は UIView A と重なっており (途中まで)、UIView B を「ドラッグ」して UIView A と重ねることができます。元の位置 (UIView A の開始点から画面全体にドラッグできるようにしたくありません)

今、UIViews が重なっているときに衝突を検出しようとしています。ただし、何も検出されません。convertRect:toView: を使用して同じシステム上の座標を取得していますが、touchesMoved で UIView B の座標をトレースすると、「ドラッグ」(実際には UIScrollView のスクロール) がフレームの原点座標に影響しないことがわかります。これらは、touchedMoved が発火するたびに発生するのと同じように、touchedBegan でも同じです。

これは、UIView B が実際にはどこにも移動していないため、UIScrollView が移動しているためであると想定しています。つまり、UIView の原点は、その絶対座標が移動していなくても常に同じです。これを処理する方法について何か提案はありますか?

4

1 に答える 1

0

scrollView.frame.origin.x + viewB.frame.size.width + scrollView.contentOffset.x >= viewA.frame.origin.x の場合、オーバーラップが発生します。

編集後:

スクロール ビューを動作させることができなかったので、うまく動作する別の方法を試してみました。スクロール ビューの代わりに、背景色のある長方形のビューを使用し、それに青い正方形を追加しました。IB で青い四角形に幅と高さを設定し、(y 方向の) 細長いビューの中央に配置し、その長いビューの左側にもう 1 つの制約を設定しました。IBOutlet leftCon はその制約に接続されています。次に、このコードを使用してドラッグし、離すと元に戻ります。

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()
@property (strong,nonatomic) UIPanGestureRecognizer *panner;
@property (strong,nonatomic) IBOutlet NSLayoutConstraint *leftCon;
@property (strong,nonatomic) CADisplayLink *displayLink;
@end

@implementation ViewController {
    IBOutlet UIView *blueSquare;
}

-(void)viewDidLoad {
    self.panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    [blueSquare addGestureRecognizer:self.panner];
}

- (void)handlePanGesture:(UIPanGestureRecognizer *)sender {
    CGPoint translate = [sender translationInView:self.view];
    if (self.leftCon.constant <160)
        if (self.leftCon.constant > 100) NSLog(@"Bang! We have a collision");
        self.leftCon.constant = translate.x;
    if (sender.state == UIGestureRecognizerStateEnded){
        [self startDisplayLink];
    }
}


-(void)startDisplayLink {
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(bounceBack:)];
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)stopDisplayLink {
    [self.displayLink invalidate];
    self.displayLink = nil;
}


-(void)bounceBack:(CADisplayLink *) link {
    self.leftCon.constant -= 12;
    if (self.leftCon.constant < 2) {
        [self stopDisplayLink];
        self.leftCon.constant = 2;
    }
}

変換コードの数値 (160 と 100) は、ログ記録によって経験的に決定されました。160 の数字は、長いビューの右端から外れないようにします。100 の数字は、ブラック ボックスと重なり始める場所です。

于 2013-02-11T02:22:13.850 に答える