[英]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];
}
當我的視線實際上完全從屏幕上消失時,我遇到了很多麻煩。
我的觀點很簡單。 這是一個帶有UIImageView
的UIScrollView
。 兩者都在UIViewController
。 我用平移手勢移動了UIScrollView
,但是想檢測圖像視圖何時不在屏幕上。
在action
塊中,我可以監視視圖的移動,並且嘗試了兩種方法:
1.每次調用該action
塊時,請在y
找到圖像視圖的最低點。 將其轉換為視圖控制器的參考點,而當我向上“向上”投射視圖時,我只是想查看轉換點的y
值何時小於0(負)。 (這意味着視圖中的最低點已變成視圖控制器參考點的y
負值,該值在視圖控制器的可見區域上方。)
這個工作正常,除了我給lowestPoint
的x
值確實弄亂了所有東西。 如果我選擇最小的X,它是最左邊的X,它只會告訴我UIView
左下角何時離開屏幕。 通常情況下,視視圖旋轉的時間取決於用戶從何處推動,右下角可能會在屏幕左移后離開屏幕,從而使其檢測得太早了。 如果我選擇中間的X,它只會告訴我中間的底部何時消失,等等。 我似乎無法弄清楚如何分辨它“只是讓我獲得絕對的最低y值。
2.我按照上面的代碼所示嘗試了CGRectIntersectsRect
,它從不說它在外面,即使它在任何可見區域之外拍攝了幾秒鍾也是如此。
我究竟做錯了什么? 我應該如何檢測它不再可見?
如果您查看UIDynamicItem
協議屬性,則可以看到它們是center
, bounds
和transform
。 因此, UIDynamicAnimator
實際上僅修改了這三個屬性。 我不太確定在Dynamics動畫過程中frame
會發生什么,但是根據我的經驗,我可以知道動作塊內部的值並不總是可靠的。 也許是因為CALayer實際上是根據center
, transform
和bounds
計算幀的,如這篇出色的博客文章所述 。
但是您可以確定可以在操作塊中使用center
和bounds
。 以下代碼在與您類似的情況下為我工作:
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.