мне удалось решить эту проблему таким образом:
Во-первых, добавить категорию для UIView с помощью следующего метода:
// 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;
}
Тогда, на ваш взгляд, проверьте оконном недвижимости устанавливается:
-(void)didMoveToWindow
{
if(self.window != nil)
[self observeSuperviewsOnOffsetChange];
else
[self removeAsSuperviewObserver];
}
Если он установлен, мы будем наблюдать «contentOffset» каждого надтаблицы на каких-либо изменений. Если окно ничтожно, мы перестанем наблюдать. Вы можете изменить Ключевой путь к любой другой собственности, может быть, «кадр», если нет UIScrollView в ваших superviews:
-(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» -метод:
-(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. И именно по этой причине я хочу получить уведомление, если вид станет видимым. –