21


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

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

有了beginTrackingWithTouchendTrackingWithTouch我无法识别唯一的UIControlEventTouchUpInside事件。

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

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

谢谢 :(

4

3 回答 3

39

我认为 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;
}
于 2010-12-13T11:48:09.883 回答
21

为了使这个答案保持最新,这里是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
        }
    }
}
于 2015-09-21T22:46:36.327 回答
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

因此,alpha我们可以更改 tint 颜色,而不是更改值,它会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;
}
于 2016-06-20T13:49:56.133 回答