我正在使用 UIKit Dynamics 将 UIView 推离屏幕,类似于 Tweetbot 在其图像叠加层中执行它的方式。
我使用 a UIPanGestureRecognizer,当他们结束手势时,如果他们超过速度阈值,它就会离开屏幕。
    [self.animator removeBehavior:self.panAttachmentBehavior];
    CGPoint velocity = [panGestureRecognizer velocityInView:self.view];
    if (fabs(velocity.y) > 100) {
        self.pushBehavior = [[UIPushBehavior alloc] initWithItems:@[self.scrollView] mode:UIPushBehaviorModeInstantaneous];
        [self.pushBehavior setTargetOffsetFromCenter:centerOffset forItem:self.scrollView];
        self.pushBehavior.active = YES;
        self.pushBehavior.action = ^{
            CGPoint lowestPoint = CGPointMake(CGRectGetMinX(self.imageView.bounds), CGRectGetMaxY(self.imageView.bounds));
            CGPoint convertedPoint = [self.imageView convertPoint:lowestPoint toView:self.view];
            if (!CGRectIntersectsRect(self.view.bounds, self.imageView.frame)) {
                NSLog(@"outside");
            }
        };
        CGFloat area = CGRectGetWidth(self.scrollView.bounds) * CGRectGetHeight(self.scrollView.bounds);
        CGFloat UIKitNewtonScaling = 5000000.0;
        CGFloat scaling = area / UIKitNewtonScaling;
        CGVector pushDirection = CGVectorMake(velocity.x * scaling, velocity.y * scaling);
        self.pushBehavior.pushDirection = pushDirection;
        [self.animator addBehavior:self.pushBehavior];
    }
当我的视图实际上完全从屏幕上消失时,我很难检测到。
我的观点是设置相当简单。它是一个里面UIScrollView有一个UIImageView。两者都在一个UIViewController. 我UIScrollView使用平移手势移动 ,但想检测图像视图何时离开屏幕。
在action块中,我可以在视图移动时对其进行监视,并且我尝试了两种方法:
1.每次action调用块时,找到图像视图的最低点y。将其转换为视图控制器的参考点,当我向上“抛出”视图时,我只是想查看y转换点的值何时小于 0(负)。(这意味着视图中的最低点已经越过y了视图控制器参考点的负值,该参考点位于视图控制器的可见区域之上。)
这工作得很好,除了x我给的价值lowestPoint真的把一切都搞砸了。如果我选择最小的 X,即最左边的 X,它只会告诉我左下角何时离开UIView屏幕。通常情况下,视图可以根据用户从哪里推动而旋转,右下角可能会在左下角之后离开屏幕,使其过早检测到它。如果我选择中间 X,它只会告诉我中间底部何时消失,等等。我似乎不知道如何告诉它“只要给我绝对最低的 y 值。
2.我按照上面的代码尝试过CGRectIntersectsRect,它从来没有说它在外面,即使在它在任何可见区域之外拍摄几秒钟后也是如此。
我究竟做错了什么?我应该如何检测它不再可见?