【问题标题】:UIButton gradient not workingUIButton渐变不起作用
【发布时间】:2013-07-04 20:10:53
【问题描述】:

我从教程中找到了这段代码并尝试使用它:

CAGradientLayer *btnGradient = [CAGradientLayer layer];
btnGradient.frame = button.bounds;
btnGradient.colors = [NSArray arrayWithObjects:
                      (id)[[UIColor colorWithRed:102.0f / 255.0f green:102.0f / 255.0f blue:102.0f / 255.0f alpha:1.0f] CGColor],
                      (id)[[UIColor colorWithRed:51.0f / 255.0f green:51.0f / 255.0f blue:51.0f / 255.0f alpha:1.0f] CGColor],
                      nil];
[button.layer insertSublayer:btnGradient atIndex:0];

代码在 viewDidLoad 方法中。

按钮在 .h 文件中定义如下:@property (nonatomic, strong) IBOutlet UIButton *button;

它在 .m 文件中是 @synthesized,它在界面生成器中连接

我可以对按钮进行其他自定义,例如更改其背景颜色(纯色)和更改文本颜色。但是当我尝试使用渐变色时,背景只是透明的。

感谢您的帮助!

【问题讨论】:

    标签: iphone ios objective-c cocoa uibutton


    【解决方案1】:

    您需要将渐变层的边框设置为覆盖整个按钮。有可能在viewDidLoad 处,按钮的大小为零,这使得渐变层的框架为零......后来当按钮的大小发生变化时,渐变层的框架不会相应地改变。

    继承 UIButton 并覆盖 layoutSubviews 是个好主意

    @interface MyButton : UIButton {
    
    }
    
    @implementation MyButton {
        CAGradientLayer* _gradient;
    }
    
    -(id)init {
        self = [super init];
    
        _gradient = [CAGradientLayer layer];
        _gradient.colors = [NSArray arrayWithObjects:
                          (id)[[UIColor colorWithRed:102.0f / 255.0f green:102.0f / 255.0f blue:102.0f / 255.0f alpha:1.0f] CGColor],
                          (id)[[UIColor colorWithRed:51.0f / 255.0f green:51.0f / 255.0f blue:51.0f / 255.0f alpha:1.0f] CGColor],
                          nil];
        [self.layer insertSublayer:_gradient atIndex:0];
    }
    
    -(void)layoutSubviews {
        [super layoutSubviews];
    
         _gradient.frame = self.bounds;
    }
    
    @end
    

    另一个选项是使用observeValueForKeyPath... 来检测按钮框架的变化,并相应地调整图层大小。不是一个非常可重用的解决方案。

    【讨论】:

    • [self.layer insertSublayer:_gradient atIndex:0];是我正在寻找的解决方案。非常感谢!
    【解决方案2】:

    我遇到了渐变没有出现的问题。就像@khanhnguyen 说的那样,问题是我在 viewDidLoad 中设置了它,因此按钮的边界是未知的,所以什么都没有出现。

    当我将代码移至 viewDidLayoutSubviews 时,它出现了。这是 Swift 中的答案:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        let purpleColor = UIColor(red: 129/255, green: 52/255, blue: 175/255, alpha: 1)
        let pinkColor = UIColor(red: 221/255, green: 42/255, blue: 123/255, alpha: 1)
        let yellowColor = UIColor(red: 254/255, green: 218/255, blue: 119/255, alpha: 1)
    
        let gradientLayer = CAGradientLayer()
    
        gradientLayer.frame = yourButton.bounds
        gradientLayer.colors = [purpleColor.cgColor, pinkColor.cgColor, yellowColor.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
    
        yourButton.layer.insertSublayer(gradientLayer, at: 0)
    }
    

    如果使用集合视图单元格,请将其添加到:

    override func layoutSubviews() {
           super.layoutSubviews()
    }
    

    【讨论】:

      【解决方案3】:

      可能首先您需要设置框架按钮。试试这个。

      + (UIButton*) buttonWithGradient:(CGSize)size beginColor:(UIColor*)beginColor endColor:(UIColor*)endColor
      {
          CGRect frame = { CGPointZero, size };
      
          UIButton* button = [[UIButton alloc] initWithFrame:frame];
      
          CAGradientLayer* gradient = [CAGradientLayer layer];
          gradient.frame = frame;
          gradient.colors = @[(id)beginColor.CGColor, (id)endColor.CGColor];
          [button.layer insertSublayer:gradient atIndex:0];
      
          return [button autorelease];
      }
      

      【讨论】:

      • 我该如何使用它? (我对obj-c/cocoa不是很熟悉)
      • rewrite + (UIButton*) buttonWith... -> - (UIButton*) buttonWith... 在你的类中: UIButton *button = [self buttonWithGradient:"your size" beginColor:"你的开始颜色" endColor:"你的结束颜色"];
      • 方法以+静态方法开头。
      • 我以编程方式制作了整个按钮并使用了您的方法,现在它可以工作了!谢谢!
      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 2017-11-12
      • 1970-01-01
      • 2017-05-29
      • 2018-12-12
      • 1970-01-01
      • 2011-08-25
      • 2015-03-16
      相关资源
      最近更新 更多