簡體   English   中英

為什么我無法檢測到何時不再可以看到使用UIKit Dynamics推送的UIView?

[英]Why am I unable to detect when my UIView I push off screen using UIKit Dynamics is no longer visible?

我正在使用UIKit Dynamics將UIView推離屏幕,類似於Tweetbot在其圖像疊加層中執行它的方式。

我使用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];
    }

當我的視線實際上完全從屏幕上消失時,我遇到了很多麻煩。

我的觀點很簡單。 這是一個帶有UIImageViewUIScrollView 兩者都在UIViewController 我用平移手勢移動了UIScrollView ,但是想檢測圖像視圖何時不在屏幕上。

action塊中,我可以監視視圖的移動,並且嘗試了兩種方法:

1.每次調用該action塊時,請在y找到圖像視圖的最低點。 將其轉換為視圖控制器的參考點,而當我向上“向上”投射視圖時,我只是想查看轉換點的y值何時小於0(負)。 (這意味着視圖中的最低點已變成視圖控制器參考點的y負值,該值在視圖控制器的可見區域上方。)

這個工作正常,除了我給lowestPointx值確實弄亂了所有東西。 如果我選擇最小的X,它是最左邊的X,它只會告訴我UIView左下角何時離開屏幕。 通常情況下,視視圖旋轉的時間取決於用戶從何處推動,右下角可能會在屏幕左移后離開屏幕,從而使其檢測得太早了。 如果我選擇中間的X,它只會告訴我中間的底部何時消失,等等。 我似乎無法弄清楚如何分辨它“只是讓我獲得絕對的最低y值。

2.我按照上面的代碼所示嘗試了CGRectIntersectsRect ,它從不說它在外面,即使它在任何可見區域之外拍攝了幾秒鍾也是如此。

我究竟做錯了什么? 我應該如何檢測它不再可見?

如果您查看UIDynamicItem協議屬性,則可以看到它們是centerboundstransform 因此, UIDynamicAnimator實際上僅修改了這三個屬性。 我不太確定在Dynamics動畫過程中frame會發生什么,但是根據我的經驗,我可以知道動作塊內部的值並不總是可靠的。 也許是因為CALayer實際上是根據centertransformbounds計算幀的,如這篇出色的博客文章所述

但是您可以確定可以在操作塊中使用centerbounds 以下代碼在與您類似的情況下為我工作:

CGPoint parentCenter = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));
self.pushBehavior.action = ^{
    CGFloat dx = self.imageView.center.x - parentCenter.x;
    CGFloat dy = self.imageView.center.y - parentCenter.y;
    CGFloat distance = sqrtf(dx * dx + dy * dy);
    if(distance > MIN(parentCenter.y + CGRectGetHeight(self.imageView.bounds), parentCenter.x + CGRectGetWidth(self.imageView.bounds))) {
       NSLog(@"Off screen!");
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM