2010-12-13 109 views
16


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

好吧,我得到了这一切与UIControl一个子类(因为继承UIButton不是推荐的子类UIImageView使得难以管理点1)。 但现在什么是突出显示它的正确方法? 我想强调以任何方式轻触控制(即使是简单的瞬间减少阿尔法)。

With beginTrackingWithTouch and endTrackingWithTouch我无法识别唯一的UIControlEventTouchUpInside事件。

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

是否有一个简单而直接的解决方案?

感谢:(

回答

35

我觉得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; 
} 
+4

如果您有任何子视图,不要忘记设置mySubview.userInteractionEnabled = NO(否则自来水不会注册,没有高亮将被触发)。 – 2014-04-23 19:22:57

12

在保持这个答案是最新的利益,这里是Swift版本(Costique的回答)

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

您可能也想淡化UIControl的调光。要做到这一点,只需将阿尔法分配在一个动画块,这样

override var highlighted: Bool { 
    didSet { 
     UIView.animateWithDuration(0.25) { _ in 
      self.alpha = self.highlighted ? 0.6 : 1.0 
     } 
    } 
} 
+0

我发现使用'didSet'触摸引起的延迟。 'set(突出显示){'运作得更好 - 但前提是我没有打电话超级 – Sam 2016-10-12 18:32:28

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; 
}