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。希望我能回答你的问题?