观察UIView窗口和超级视图属性的更改

当通用UIView被添加或从可见视图层次结构中删除时,我正在寻找一种通知方式。在这种情况下,KVO看起来像是完美的东西,但观察视图窗口或超级视图属性的更改不会做任何事情。对框架或backgroundColor等属性的更改按预期工作,但更改为与视图层次结构相关的属性似乎不会调用observeValueForKeyPath。

我检查了UIView是否支持这些属性上的KVO,通过调用automaticNotificationsObserversForKey,UIView报告为YES,这两个都让我失望。所以我的问题是:

1)有没有办法使用KVO通知有关视图被添加/删除到视图层次结构的事件?

2)如果不是还有另一种方式被通知不涉及UIView子类的这些事件?

这是一种方式。是吗?是。我推荐这样的行为吗?不,但我们都是大人。

要点是,您使用method_setImplementation来更改 – [UIView didAddSubview:]的实现,以便在调用时收到通知(并且您将为willRemoveSubview :)做同样的事情。不幸的是,您将获得所有视图层次结构更改的调用。您必须添加自己的过滤以查找您感兴趣的具体视图。

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);
});
http://stackoverflow.com/questions/5612863/observing-changes-to-a-uiviews-window-and-superview-properties

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:观察UIView窗口和超级视图属性的更改