iPhone iOS自定义UIButton与CAGradientLayer,如何让它指示触摸?

Posted

技术标签:

【中文标题】iPhone iOS自定义UIButton与CAGradientLayer,如何让它指示触摸?【英文标题】:iPhone iOS custom UIButton with CAGradientLayer, how to make it indicate touch? 【发布时间】:2012-10-20 17:37:52 【问题描述】:

我的视图控制器中有一个自定义样式的 UIButton,它是通过使用 CAGradientLayer 自定义 UIButton、圆角并在图层周围添加边框来实现的。

我喜欢这些按钮的外观和感觉,而且它们也很容易实现,无需使用预渲染图像。但是我遇到了一个问题 - 这样的按钮不会像 UIButton 那样响应触摸。例如,一个典型的圆角矩形按钮在被点击时会突出显示蓝色,但我的按钮没有。

如果我按照下面的代码在 UIButton 上使用自定义 CAGradientLayer 背景,如何实现“触摸突出显示按钮”行为?

感谢您的意见!

+(void)addLinearGradientToView:(UIView*)view TopColor:(UIColor*)topColor BottomColor:(UIColor*)bottomColor

    for(CALayer* layer in view.layer.sublayers)
    
        if ([layer isKindOfClass:[CAGradientLayer class]])
        
            [layer removeFromSuperlayer];
        
    
   CAGradientLayer* gradientLayer = [CAGradientLayer layer];
    //top down gradient
    gradientLayer.startPoint = CGPointMake(0.5, 0);
    gradientLayer.endPoint = CGPointMake(0.5,1);
    gradientLayer.frame = view.bounds;



    gradientLayer.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];

    [view.layer insertSublayer:gradientLayer atIndex:0];


【问题讨论】:

【参考方案1】:

如果您将 UIButton 子类化,您可以覆盖 setHighlighted 方法。在这里您可以在按钮上设置不同的渐变,或更改背景颜色。

- (void)setHighlighted:(BOOL)highlighted 
    [super setHighlighted:highlighted];
    // Update the looks of the button

【讨论】:

【参考方案2】:

代码中的 for 循环会引发错误。

你应该像这样向后循环层

NSEnumerator *enumerator = [btn.layer.sublayers reverseObjectEnumerator];
for(CALayer *layer in enumerator) 
    if ([layer isKindOfClass:[CAGradientLayer class]])
    
        [layer removeFromSuperlayer];
    

【讨论】:

以上是关于iPhone iOS自定义UIButton与CAGradientLayer,如何让它指示触摸?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用中自定义 UIButton 旁边出现“蓝框”

iPhone 在 IB 中为自定义 UIView 创建 UIButton

将自定义文本添加到 iPhone sdk 中的 uibutton

iPhone SDK:带有自定义图像的 UIButton 可以显示标题吗?

使用 6 行 7 列的 Uibutton 数组在 iphone 中创建自定义日历

自定义 UIButton 嵌入图像大小