0

我有一个屏幕,其中包含:

  • UIView A
  • UIScrollView,其中包含 UIView B

UIScrollView 与 UIView A 重叠(直到大约一半),允许我“拖动” UIView B 并使其与 UIView A 重叠。这样当我放开它时,UIView B 很好地弹回它的原始位置(我不想将它拖到整个屏幕上,只是从它的起点到 UIView A)

现在,我正在尝试在 UIView 重叠时检测碰撞。然而,没有一个被检测到。我正在使用 convertRect:toView: 来获取同一系统上的坐标,但是通过在其 touchesMoved 中跟踪 UIView B 的坐标,我看到“拖动”(实际上是滚动 UIScrollView)不会影响其框架的原点坐标。它们在touchBegan 中和每次touchMoved 火时都是一样的。

我假设这是因为 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 方向),并且对该长视图的左侧有另一个约束。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 回答