: 윈도우 재산권 있는지 확인,보기에,
// retrieve an array containing all super views
-(NSArray *)getAllSuperviews
{
NSMutableArray *superviews = [[NSMutableArray alloc] init];
if(self.superview == nil) return nil;
[superviews addObject:self.superview];
[superviews addObjectsFromArray:[self.superview getAllSuperviews]];
return superviews;
}
다음 :
먼저 다음과 같은 방법으로 UIView에 대한 카테고리를 추가 설정 :이 설정되어있는 경우, 우리가 어떤 변화를 각 수퍼의 "contentOffset"을 준수합니다
-(void)didMoveToWindow
{
if(self.window != nil)
[self observeSuperviewsOnOffsetChange];
else
[self removeAsSuperviewObserver];
}
. 창문이 없으면 관찰을 멈 춥니 다.
-(void)observeSuperviewsOnOffsetChange
{
NSArray *superviews = [self getAllSuperviews];
for (UIView *superview in superviews)
{
if([superview respondsToSelector:@selector(contentOffset)])
[superview addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
}
}
-(void)removeAsSuperviewObserver
{
NSArray *superviews = [self getAllSuperviews];
for (UIView *superview in superviews)
{
@try
{
[superview removeObserver:self forKeyPath:@"contentOffset"];
}
@catch(id exception) { }
}
}
는 이제 "observeValueForKeyPath"-method 구현 : 당신의 superviews에는있는 UIScrollView가없는 경우 당신은 어떤 다른 재산, 어쩌면 "프레임"에 키 패스를 변경할 수 있습니다 마지막으로
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"contentOffset"])
{
[self checkIfFrameIsVisible];
}
}
이 있는지 확인 보기의 프레임은 창 프레임 안에 표시됩니다.
-(void)checkIfFrameIsVisible
{
CGRect myFrameToWindow = [self.window convertRect:self.frame fromView:self];
if(myFrameToWindow.size.width == 0 || myFrameToWindow.size.height == 0) return;
if(CGRectContainsRect(self.window.frame, myFrameToWindow))
{
// We are visible, do stuff now
}
}
내 탐색은 UIScrollView를 가로로 스크롤하는 것을 기반으로합니다. 나는 또한 서브 클래 싱 된 UIWindow를 통해 감청을 가로 채고있다. 따라서 현재 보이는 뷰의 ViewController는 자신을 서브 클래 싱 된 UIWindow에 대한 델리게이트로 등록해야합니다. 그리고 이것이 내가보기가 보일 때 통보 받기를 원하는 이유입니다. –