1.增加标识。
BOOL值 isShow直接标记,添加到superView时,isShow = YES,从superView移除时,isShow = NO。
2.遍历所有子视图进行操作,这样可以同时对多个子视图进行操做,移除视图释放内存等。
for(UIView * view in [self.view subviews])
{
if([View isKindOfCless:[OneViewObject class]])
{
}
}
3.IOS判断当前UIViewController 是否正在显示。
某些情况下,需判断当前ViewController是否正在显示,比如后台网络请求报错,我们可能只希望在发起请求的页面弹窗提示用户,当用户已经跳转到其他界面,不做弹窗,减少对用户的干扰。
假如一个UIView对象当前正在显示,那么它的window属性肯定为非空值。虽然官方文档未说明UIView未显示时window属性的取值, 但是经过简单的测试,大部分情况下UIView未显示时,window的值为空,因此依据此判断当前UIViewController是否正在显示。
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window);
}
4.如何判断一个view 是否在另外一个view范围内。
其原理是将两个view的坐标convert 到相对于同一个view的坐标,再对比
5.通过添加类别判断View是否显示。
#import <UIKit/UIKit.h>
@interface UIView (UIScreenDisplaying)
// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen;
@end
#import "UIView+UIScreenDisplaying.h"
@implementation UIView (UIScreenDisplaying)
// 判断View是否显示在屏幕上
- (BOOL)isDisplayedInScreen
{
if (self == nil) {
return FALSE;
}
CGRect screenRect = [UIScreen mainScreen].bounds;
// 转换view对应window的Rect
CGRect rect = [self convertRect:self.frame fromView:nil];
if (CGRectIsEmpty(rect) || CGRectIsNull(rect)) {
return FALSE;
}
// 若view 隐藏
if (self.hidden) {
return FALSE;
}
// 若没有superview
if (self.superview == nil) {
return FALSE;
}
// 若size为CGrectZero
if (CGSizeEqualToSize(rect.size, CGSizeZero)) {
return FALSE;
}
// 获取 该view与window 交叉的 Rect
CGRect intersectionRect = CGRectIntersection(rect, screenRect);
if (CGRectIsEmpty(intersectionRect) || CGRectIsNull(intersectionRect)) {
return FALSE;
}
return TRUE;
}
@end