gpt4 book ai didi

uiview - 观察 UIView 的窗口和 super View 属性的变化

转载 作者:行者123 更新时间:2023-12-03 11:01:13 24 4
gpt4 key购买 nike

我正在寻找一种在从可见 View 层次结构中添加或删除通用 UIView 时收到通知的方法。在这种情况下,KVO 看起来是完美的选择,但是观察 View 窗口或 super View 属性的变化并没有做任何事情。对 frame 或 backgroundColor 等属性的更改按预期工作,但更改为与 View 层次结构相关的属性似乎从未调用过observeValueForKeyPath。

我通过调用automaticNotifyingObserversForKey来检查UIView是否支持这些属性的KVO,并且UIView对两者都报告了YES,让我不知所措。所以我的问题是:

1) 有没有办法使用 KVO 来通知与添加/删除到 View 层次结构的 View 相关的事件?

2)如果没有,是否有另一种方法可以通知此类事件,而不涉及子类化 UIView?

最佳答案

这是一种方法。很恶心吗?是的。我推荐这种行为吗?不,但我们在这里都是成年人。

要点是您使用 method_setImplementation 来更改 -[UIView didAddSubview:] 的实现所以每当它被调用时你都会得到通知(你会对 willRemoveSubview: 做同样的事情)。不幸的是,所有 View 层次结构更改都会调用您。您必须添加自己的过滤器才能找到您感兴趣的特定 View 。

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);
});

关于uiview - 观察 UIView 的窗口和 super View 属性的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5612863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com