基本上我需要一个图像按钮,特别是一个自定义对象:
1)点击时调用控制器的动作
2)封装自定义数据
3)由包装器视图(不相关)自动移动
好吧,我用UIControl
的子类得到了所有这些(因为不建议继承子UIButton
,并且子类化UIImageView
使得难以管理点1)。
但现在突出它的正确方法是什么?
我想以任何方式点击控件(即使是简单的alpha瞬间减少)。
使用beginTrackingWithTouch
和endTrackingWithTouch
,我无法识别唯一的UIControlEventTouchUpInside
事件。
控制器中的视图动画?在我看来,这是一个粗略的解决方案
是否有一个简单而直接的解决方案?
谢谢:(
答案 0 :(得分:36)
我认为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;
}
答案 1 :(得分:16)
为了使这个答案保持最新,这里是 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
}
}
}
答案 2 :(得分: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
值,而是自动更改其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;
}