Вот способ.Это брутто?Да.Я рекомендую такое поведение?Нет. Но мы все здесь взрослые.
Суть в том, что вы используете method_setImplementation, чтобы изменить реализацию - [UIView didAddSubview:], чтобы вы получали уведомление всякий раз, когда он вызывается (и вы делаете то же самоедля воли Удалите Sububview :).К сожалению, вас будут вызывать для всех изменений иерархии представлений.Вам нужно будет добавить свою собственную фильтрацию, чтобы найти нужные вам виды.
static void InstallAddSubviewListener(void (^listener)(id _self, UIView* subview))
{
if ( listener == NULL )
{
NSLog(@"listener cannot be NULL.");
return;
}
Method addSubviewMethod = class_getInstanceMethod([UIView class], @selector(didAddSubview:));
IMP originalImp = method_getImplementation(addSubviewMethod);
void (^block)(id, UIView*) = ^(id _self, UIView* subview) {
originalImp(_self, @selector(didAddSubview:), subview);
listener(_self, subview);
};
IMP newImp = imp_implementationWithBlock((__bridge void*)block);
method_setImplementation(addSubviewMethod, newImp);
}
Чтобы использовать, сделайте что-то вроде:
InstallAddSubviewListener(^(id _self, UIView *subview) {
NSLog(@"-[UIView didAddSubview:] self=%@, view=%@", _self, subview);
});