1、检测view在特定前提下是否可见
简短的代码很难检测当前视图是否在屏幕上可见,因为存在被兄弟视图或者父视图被叔辈视图完全遮挡的情况,其实也没有必要写大量的代码去实现通用的逻辑,在大前提下能判断时,针对特定情况在添加少量代码即可实现最终目的,效率自然也是最高的。
UIView的window属性为nil的几种情况
- 父视图为nil
- 父视图的父视图为nil,以及父父父父...视图(非主窗口)为nil
- 离开导航栈顶
- 非tabBarController的选中视图
@implementation UIView (CheckVisible)
+ (BOOL)_checkVisible:(UIView *)view inView:(UIView *)inView
{
if(!inView){
return YES;
}
CGRect frameInView = view.frame;
if(inView!=view.superview){
frameInView = [inView convertRect:view.frame fromView:view.superview];
}
if(CGRectIntersectsRect(frameInView, inView.bounds))
{
return [self _checkVisible:view inView:inView.superview];
}
return NO;
}
- (BOOL)checkVisibleOnScreen
{
if(self.hidden){
return NO;
}
if(!self.window){
return NO;
}
if(!self.superview){
return NO;
}
return [UIView _checkVisible:self inView:self.superview];
}
@end
CGRectIntersectsRect
检测两个rect是否相交
https://developer.apple.com/documentation/coregraphics/1454747-cgrectintersectsrect
网友评论