Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.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
Ios 当我禁用/启用按钮时,视图如何重新绘制自身?_Ios_Uiview_Autolayout_Drawing_Layoutsubviews - Fatal编程技术网

Ios 当我禁用/启用按钮时,视图如何重新绘制自身?

Ios 当我禁用/启用按钮时,视图如何重新绘制自身?,ios,uiview,autolayout,drawing,layoutsubviews,Ios,Uiview,Autolayout,Drawing,Layoutsubviews,如果我启用/禁用一个按钮…会在视图上调用什么方法 我已经在layoutSubviews上放置了一个断点,但没有看到它到达那里。它也不会到达viewController的视图willlayoutsubviews。所以我只是想知道它是如何工作的,它触发了什么方法,这是个好问题。我自己对此很好奇,所以我创建了一个简单的UIButton子类,并在一些被重写的方法上设置断点。以下是我的发现: 调用setEnabled:在UIButton子类实例上,我在viewDidLoad中调用了MyButton 这触发

如果我启用/禁用一个按钮…会在视图上调用什么方法


我已经在
layoutSubviews
上放置了一个断点,但没有看到它到达那里。它也不会到达viewController的
视图willlayoutsubviews
。所以我只是想知道它是如何工作的,它触发了什么方法,这是个好问题。我自己对此很好奇,所以我创建了一个简单的
UIButton
子类,并在一些被重写的方法上设置断点。以下是我的发现:

  • 调用
    setEnabled:
    UIButton
    子类实例上,我在
    viewDidLoad
    中调用了
    MyButton
  • 这触发了对
    setNeedsDisplay
    方法的调用。它由
    UIButton
    类的
    setEnabled
    方法在内部调用。从本屏幕截图中的堆栈跟踪中可以看到:

  • setNeedsDisplay
    之后,触发了
    setNeedsLayout
    方法。堆栈跟踪与前面的调用类似:

  • 在此之后,按以下顺序调用了以下方法:
    layoutSubviews
    drawLayer:inContext:
    drawRect:

  • 根据
    UIView
    类的

    当视图的实际内容发生更改时,您有责任通知系统需要重新绘制视图。您可以通过调用视图的setNeedsDisplay()或setNeedsDisplay(:)方法来实现这一点。这些方法让系统知道它应该在下一个绘图周期中更新视图。由于要等到下一个绘图周期才能更新视图,因此可以在多个视图上调用这些方法来同时更新它们

    下面是关于
    UIControl
    启用的
    布尔值的文档:

    指示控件是否已启用的布尔值。 将此属性的值设置为“是”以启用控件,或设置为“否”以禁用控件。启用的控件能够响应用户交互,而禁用的控件忽略触摸事件,并可能以不同的方式绘制自身。将此属性设置为否将uicontrol状态禁用标志添加到控件的状态位掩码;再次启用该控件将删除该标志

    他们提到禁用的控件可能会以不同的方式重新绘制自身。它们还提到控件的
    状态
    位掩码已更新。因此,我相信,苹果的
    UIButton
    类在内部调用了
    setNeedsDisplay
    方法,这反过来又迫使它自己重新绘制。基于
    (UIControlState)状态
    属性,按钮分别绘制自身。您可以找到有关UIButton图形和UIView图形的详细信息


    但它可能不会触发
    UIViewController
    视图上的任何事件,该视图将按钮作为子视图。尽管如此,如果要在视图控制器或按钮的superview中侦听对属性的更改,您可以使用KVO并观察
    enabled
    属性。

    1。所有这些都发生在
    ui按钮
    层?实际上,我把它写在按钮的父视图和视图的超级视图上。我没有覆盖按钮本身的任何方法。我想就这些了。2.我只是想确定一下。你是说按钮的超级视图中没有出现任何方法?!是的,我刚注意到你说的是按钮的超视图。我相应地更新了我的答案。我不认为按钮的superview会得到任何事件回调。只是为了澄清Pranay:我的层次结构就是viewcontroller的view>>子视图>>按钮(在子视图内部)。我正在查看子视图和viewcontroller的子视图。你检查了按钮本身。是的,我检查了按钮本身。我想当你在你的问题中说“在视图上调用什么方法”时,你是在谈论按钮的视图本身。无论如何,在您提到的层次结构中,当按钮被启用或禁用时,按钮的superview和视图控制器都不会得到任何回调。但是如果您想在按钮启用或禁用时得到通知,可以使用KVO。希望我能回答你的问题?