突出显示 UIControl 子类

Posted

技术标签:

【中文标题】突出显示 UIControl 子类【英文标题】:Highlighting a UIControl subclass 【发布时间】:2011-05-24 15:03:57 【问题描述】:

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

好吧,我通过 UIControl 的子类得到了所有这些(因为不推荐子类化 UIButton 并且子类化 UIImageView 很难管理第 1 点)。 但是现在突出显示它的正确方法是什么? 我想在以任何方式点击时突出显示控件(即使是简单的 alpha 瞬间减少)。

对于beginTrackingWithTouchendTrackingWithTouch,我无法识别唯一的UIControlEventTouchUpInside 事件。

控制器中的视图动画?在我看来这是一个粗略的解决方案

有没有简单直接的解决方案?

谢谢:(

【问题讨论】:

【参考方案1】:

我认为 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;

【讨论】:

如果有子视图,别忘了设置mySubview.userInteractionEnabled = NO(否则不会注册tap,也不会触发高亮)。【参考方案2】:

为了让这个答案保持最新,这里是 Swift 版本(Costique 的答案)。

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
        
    

【讨论】:

我发现使用didSet会导致触摸延迟。 set(highlighted) 工作得更好 - 但前提是我不打电话给 super【参考方案3】:

要正确突出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

因此,我们可以更改色调颜色,而不是更改alpha 值,它会自动更改其UIImageView 子视图。在setHighlighted: 方法中,您可以将文本和色调更改为更深的颜色:

- (void)setHighlighted:(BOOL)highlighted

    [super setHighlighted:highlighted];
    UIColor *tintColor = highlighted ? [UIColor zst_darkerBlueColor] : [UIColor zst_blueColor];
    self.tintColor = tintColor;
    self.titleLabel.textColor = tintColor;

【讨论】:

以上是关于突出显示 UIControl 子类的主要内容,如果未能解决你的问题,请参考以下文章

禁用 UIButton 的突出显示 UIControl 状态

UIControl 跟踪在不同 UIControl 上开始的触摸

针对突出显示的背景设置 UIButton 突出显示的标题文本,从而产生暗淡的文本

UIButton 保持突出显示,直到 UITableView 结束滚动

将 UIImageView 从正常更改为突出显示不起作用

如何为 UIControl/UIButton 动画从一种状态到另一种状态的过渡? [复制]