Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 钩住UIView';s从第三方库更改框架_Objective C_Uiview_Frame - Fatal编程技术网

Objective c 钩住UIView';s从第三方库更改框架

Objective c 钩住UIView';s从第三方库更改框架,objective-c,uiview,frame,Objective C,Uiview,Frame,我正在建立一个第三方库,我计划将其集成到不同的项目中,因此我需要它尽可能模块化,并且具有非破坏性。我需要“钩住”对UIViews的帧更改。我正在构建一个类别,从该类别方法,我需要钩住该视图(它可以是任何常规的UIView或子类)的框架更改,并执行我的附加逻辑。我已经看过KVO,但正如这里看到的,这不是一种安全的方法 如何连接UIView的帧更改?我可以在我的类别中重写setFrame:,但我知道这是Objective-C程序员能做的最糟糕的事情:重写类别中的默认方法。我如何做到这一点 更新:我目

我正在建立一个第三方库,我计划将其集成到不同的项目中,因此我需要它尽可能模块化,并且具有非破坏性。我需要“钩住”对
UIView
s的帧更改。我正在构建一个类别,从该类别方法,我需要钩住该视图(它可以是任何常规的
UIView
或子类)的框架更改,并执行我的附加逻辑。我已经看过KVO,但正如这里看到的,这不是一种安全的方法

如何连接
UIView
的帧更改?我可以在我的类别中重写
setFrame:
,但我知道这是Objective-C程序员能做的最糟糕的事情:重写类别中的默认方法。我如何做到这一点

更新:我目前正在研究一个非常难看(但有效)的解决方案:

  • 我创建了一个不可见的(空的
    drawRect:
    UIView
    子类
  • 我正在实例化它,并将其添加到视图中,我希望收到有关帧更改的通知
  • 我正在将该视图(“超级视图”)的AutoResizesSubView设置为
    YES
  • 我正在将“不可见”视图的自动调整大小遮罩设置为灵活的宽度和高度
  • 我正在覆盖我的“不可见”视图的
    setFrame:
    ,以通过委托通知相应的对象

因为当autoresizesSubviews为“是”时,superview将使用灵活的AutoResize mask设置所有子视图的框架,这是可行的,但它涉及在视图中添加隐藏视图,这有点老套,在某些情况下可能会产生问题(尽管大多数是角落情况)。我仍在寻找一种更合适/不太老套的解决方案。

你看过KVO吗?@CrimsonChris根据这个答案:这不是一种安全的方法。它似乎是根据另一个答案工作的,但它依赖于可能会发生变化的未记录行为,我不想利用未记录行为构建框架/库。将视图子类化是一种选择吗?您可以提供自己的方式来通过这种方式连接到帧更改中。Swizzling可能是另一种选择。@CrimsonChris不幸的是没有。我希望我的库是模块化的,与常规UIView兼容,并且易于集成。我现在正在研究一种“丑陋的方式”。请参阅我的最新问题。