iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别
Posted
技术标签:
【中文标题】iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别【英文标题】:iOS UIButton - Difference between UIButton setUserInteractionEnabled and setEnabled 【发布时间】:2015-12-04 04:55:28 【问题描述】:等等!!!:我知道您可能认为这个问题已经被问过并回答过好几次了。但我可以向您保证这个问题是独一无二的。
问题:在 ios 应用中,想象一下有两个按钮,如下图所示,它们有两个动作,其行为类似于切换逻辑。
其逻辑可能如下:
- (IBAction)testBtnClicked:(id)sender
if ([self.testBtn isEnabled])
[self.testBtn setEnabled:NO];
[self.setInteractionBtn setUserInteractionEnabled:YES];
else
[self.testBtn setEnabled:YES];
[self.setInteractionBtn setUserInteractionEnabled:NO];
- (IBAction)setInteractionBtnClicked:(id)sender
if ([self.setInteractionBtn isEnabled])
[self.setInteractionBtn setUserInteractionEnabled:NO];
[self.testBtn setEnabled:YES];
else
[self.setInteractionBtn setUserInteractionEnabled:YES];
[self.testBtn setEnabled:NO];
所以我认为setEnabled
方法和setUserInteractionEnabled
方法之间没有太大区别。它们的行为就像一个阻止用户不让使用它的单一方法。但是,如果相同,即使将setUserInteractionEnabled
设置为False
,我们如何才能检测到isEnabled
true
或false
?
以下是导致此问题不可能与 SO 中的另一个问答线程重复的原因:
尽管某些排名靠前的代码可能已将我的问题标记为可能重复,但 Q&A 并没有给我正确的理解。 正如@danh 所说,至少有一个原因是在动画期间,用户交互是 在 UIViews 上禁用。控件自己绘制是错误的 在动画时显示为灰色。所以至少在动画期间, 这两个属性有不同的含义。
给我真正的答案或理由,看看这两种方法有两个原因。因为任何人都可以说setUserInteractionEnabled
不会对 UI 状态进行更改,但至少只有在 @danh 的回答首先表明它可能会在 UI 动画期间隐式使用。
【问题讨论】:
Which is better, setEnabled or setUserInteractionEnabled?的可能重复 其实不是。因为它要求他知道不同之处,而该问卷只需要知道两者之间哪个更好。但我的问题是我需要知道确切的区别是什么以及使用哪一个。希望你能理解这是两个不同的问题。 :-) 【参考方案1】:它们几乎相同。 userInteractionEnabled
是UIView
的一个属性,用于切换视图是否接收任何用户触摸。 enabled
是UIControl
的一个属性(它是UIView
的子类和UIButton
的超类)并且具有相同的效果。一个区别是 UIKit 控件可能会根据它们的 enabled
状态以不同的方式绘制自己,而抽象 UIView
的情况并非如此。
好的,那为什么?
既然UIControl
子类都继承了两者,为什么会有两个几乎相同的属性?为什么控件不放弃“启用”的概念,根据userInteractionEnabled
状态以不同的方式绘制自己?
至少一个原因是在动画期间,UIView
s 上的用户交互被禁用。控件在动画时将自己绘制为灰色是错误的。所以至少在动画期间,这两个属性有不同的含义。
【讨论】:
还有一点,假设您有一个按钮,并且您正试图以编程方式更改该按钮的 isSelected 属性,例如因为您有两个按钮 bg 的差异图像。现在,如果您将 button.isEnabled 设置为 false,然后尝试更改 button.isSelected ,它将无法正常工作。但是,如果您这样做,请按一下。 isuserInteractionEnabled = false 并尝试设置 iselcted 属性,它将正常工作。【参考方案2】:启用的特点:
这是UIControl
的属性
UIButton
的超类。
它对对象的视觉状态有影响,通常是
禁用控件的首选方法
userInteractionEnabled 的特性:
UIView
的属性
与控件交互的代码更有可能检查是否
按钮是enabled
,而不是它们的userInteractionEnabled
属性是
放。它更传统。
【讨论】:
【参考方案3】:@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled
一个布尔值,用于确定是否忽略用户事件并将其从事件队列中删除。 当设置为 NO 时,用于视图的用户事件(例如触摸和键盘)将被忽略并从事件队列中删除。设置为 YES 时,事件将正常传递到视图。此属性的默认值为 YES。
讨论:
在动画期间,无论此属性中的值如何,都会暂时禁用动画中涉及的所有视图的用户交互。您可以通过在配置动画时指定 UIViewAnimationOptionAllowUserInteraction 选项来禁用此行为。
Apple Doc on UIView
@property(nonatomic, getter=isEnabled) BOOL enabled
一个布尔值,用于确定接收器是否启用。
讨论:
指定 YES 使控件启用;否则,指定 NO 将其禁用。默认值为是。如果启用状态为 NO,则控件会忽略触摸事件,子类可能会以不同的方式绘制。
供您参考:
-
Apple Doc on UIControl
SO Q&A
正如@danh 所说:
“至少有一个原因是在动画过程中,用户交互是 在 UIViews 上禁用。控件自己绘制是错误的 在动画时显示为灰色。所以至少在动画期间, 这两个属性有不同的含义。”
【讨论】:
以上是关于iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章