突出显示UIControl子类

21
基本上我需要一个图像按钮,具体来说是一个自定义对象,它:
1)在被点击时调用控制器的动作
2)封装自定义数据
3)由包装视图自动移动(不相关)

好吧,我使用UIControl的子类实现了所有这些(因为建议不要子类化UIButton,而子类化UIImageView会使管理点1变得困难)。 但现在正确的突显方式是什么? 我想在任何方式下高亮显示控件(甚至是简单的短暂alpha减少)。

通过beginTrackingWithTouchendTrackingWithTouch,我无法识别到唯一的UIControlEventTouchUpInside事件。

在控制器中进行视图动画?对我来说似乎是一个粗略的解决方案

有一个简单和直接的解决方案吗?

谢谢 :(

3个回答

40

我认为UIControls会根据触摸事件自动设置它们的高亮属性。你需要做的是重写-setHighlighted:方法以实现特定的算法:

- (void) setHighlighted: (BOOL) highlighted {
    [super setHighlighted: highlighted];
    // Only as an example. Caution: looks like a disabled control
    self.alpha = highlighted ? 0.5f : 1.0f;
}

10
如果您有任何子视图,请不要忘记设置mySubview.userInteractionEnabled = NO(否则,轻击将无法被注册并且不会触发高亮效果)。 - Lukas Kalinski

25

为了让这篇答案保持最新,这里是Costique回答的Swift版本。

override var isHighlighted: Bool {
    didSet {
        alpha = self.isHighlighted ? 0.6 : 1.0 // Sets alpha to 0.6 if highlighted, or 1.0 if it's not.
    }
}

您也可以尝试淡化UIControl的暗度。只需将alpha分配放置在动画块中即可,如下所示:

override var isHighlighted: Bool {
    didSet {
        UIView.animate(withDuration: 0.25) {
            self.alpha = self.isHighlighted ? 0.6 : 1.0
        }
    }
}

1
我发现使用 didSet 会导致触摸延迟。set(highlighted) { 更好 - 但只有在我不调用 super 的情况下才有效。 - Sam

0
为了正确突出显示UIControl的子视图,您可以使用自定义的色调颜色。要启用此功能,请在init方法或awakeFromNib中的某个位置将图像渲染模式更改为always template:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.backgroundImageView.image = [self.backgroundImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.tintColor = [UIColor zst_blueColor]; // Use custom instead of system-defined color

所以,我们可以通过改变色调颜色来改变其UIImageView子视图的颜色,而不是改变alpha值。在setHighlighted:方法中,您可以将文本和色调颜色更改为较暗的颜色:
- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    UIColor *tintColor = highlighted ? [UIColor zst_darkerBlueColor] : [UIColor zst_blueColor];
    self.tintColor = tintColor;
    self.titleLabel.textColor = tintColor;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接