【问题标题】:UIButton setTitleColor:forState: questionUIButton setTitleColor:forState: 问题
【发布时间】:2011-05-21 04:56:24
【问题描述】:

为什么下面的代码会起作用...

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled];

虽然没有?

[signInBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted|UIControlStateDisabled];

【问题讨论】:

  • 哇,这不起作用似乎很奇怪。 +1
  • 请注意,方法名称仅提及单数 state: 而不是 states:
  • @Jasarien 他们不应该使用位掩码
  • @Jasarien:公平点...
  • @bioffe:他们使用位掩码,因此state 属性可以表示多个状态。这再次引出了为什么state 而不是states 的问题:P

标签: iphone objective-c cocoa-touch uikit


【解决方案1】:

我知道这是一个老问题,但这些答案并不正确。

当您分别设置每个时,您是在说 state 属性应该是 UIControlStateHighlightedUIControlStateDisabled 但不能同时是两者

当你按位或它们在一起时,你说明它们必须在state 属性中设置。含义 UIControlStateHighlightedUIControlStateDisabledstate 属性中设置。

下面的示例代码完美地说明了我的观点。如果您不同意,请自行运行。

[button setTitle:@"highlighted and selected" forState:UIControlStateHighlighted | UIControlStateSelected];
[button setTitle:@"Highlighted only" forState:UIControlStateHighlighted];
[button setTitle:@"Selected only" forState:UIControlStateSelected];
[button setTitle:@"Normal" forState:UIControlStateNormal];

NSLog(@"Normal title: %@", [[button titleLabel] text]); // prints title: Normal

[button setSelected:YES];

NSLog(@"Selected title: %@", [[button titleLabel] text]); // prints title: Selected only 

[button setSelected:NO];
[button setHighlighted:YES];

NSLog(@"highlighted title: %@", [[button titleLabel] text]); // prints title: Highlighted only

[button setSelected:YES];

NSLog(@"highlighted and selected title: %@", [[button titleLabel] text]); // prints title: highlighted and selected

【讨论】:

  • 完全不同意。您有一个掩码,其中每个位代表一个状态。如果单独设置,它使用按位或。我们总是可以检索掩码值来验证这一点。为什么不能一次性设置好,超出我的理解范围。
  • 如何检索掩码值以验证它是否对上述两个调用的控制状态进行了按位或运算?
  • @bioffer:你错了,帕特里克是对的。每次调用setTitle:forState: 时,它都会在按钮内设置一个附加标题并将其分配给该特定掩码组合。当掩码组合不存在时,它会回退到为 UIControlStateNormal 掩码设置的标题。例如,如果您注释 Patrick 示例中的第一行,则最后一个 NSLog() 将打印 "highlighted and selected title: normal"。这是因为您没有为按钮同时突出显示和选中时设置标题。
  • 我同意帕特里克的观点。如果你|他们在一起,你说的是当按钮同时处于两种状态时设置颜色,而不是状态是或者。将位掩码想象成布尔值。您正在使用 | 运算符检查两个标志是否为真。
【解决方案2】:

因为 setTitleColor:forState: 方法只能接受一个已知的 UIControlState 并且您将两个 UIControlState 值组合在一起。

每个 UIControlState(在低级别)很可能是一个简单的整数常量。

更新:

这是一个位掩码,这使得它不起作用更奇怪,但我的观点仍然成立。 (虽然它惊人地向一侧倾斜并且危险地摇晃着。)

【讨论】:

【解决方案3】:

这可能是一个错误。尝试用 UIControlStateHighlightedUIControlStateDisabled 等意外值更改位掩码,它会使所有状态颜色相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多