Ios UIButton上的RadientLayer错误

Ios UIButton上的RadientLayer错误,ios,uibutton,quartz-core,cagradientlayer,Ios,Uibutton,Quartz Core,Cagradientlayer,我正在尝试对ios应用程序中的所有按钮应用一个小渐变。我为UIButton创建了一个类别,我在其中添加了这个功能,基本上为按钮添加了字幕、边框和渐变层 - (void)viewDidLoad { [super viewDidLoad]; [_myButton defaultButton]; } 在视图did load中调用该函数: - (void)viewDidLoad { [super viewDidLoad]; [_myButton buttonWithSubtitle:

我正在尝试对ios应用程序中的所有按钮应用一个小渐变。我为UIButton创建了一个类别,我在其中添加了这个功能,基本上为按钮添加了字幕、边框和渐变层

- (void)viewDidLoad
{
  [super viewDidLoad];
  [_myButton defaultButton];

}
在视图did load中调用该函数:

- (void)viewDidLoad
{
  [super viewDidLoad];
  [_myButton buttonWithSubtitle:@"test subtitle"];

}
以及类别功能

- (void)buttonWithSubtitle:(NSString*)subtitleText
{
  UILabel *subTitle = [[UILabel alloc] initWithFrame:CGRectMake(80, 20, 100, 30)];
  [subTitle setText:subtitleText];
  [subTitle setTextColor:[UIColor colorWithRed:(144.0 / 255.0) green:(144.0 / 255.0) blue:(144.0 / 255.0) alpha:1.0]];
  [subTitle setBackgroundColor:[UIColor clearColor]];
  [subTitle setFont:[UIFont fontWithName:@"American Typewriter" size:12]];
  [self.titleLabel setFrame:CGRectMake(30, 20, 100, 30)];

  [self setTitle:@"Main title" forState:UIControlStateNormal];
  [self addSubview:subTitle];

  CAGradientLayer *btnGradient = [CAGradientLayer layer];
  btnGradient.frame = self.bounds;
  btnGradient.colors = [NSArray arrayWithObjects:
                        (id)[[UIColor colorWithRed:255.0f / 255.0f green:255.0f / 255.0f blue:255.0f / 255.0f alpha:1.0f] CGColor],
                        (id)[[UIColor colorWithRed:234.0f / 255.0f green:234.0f / 255.0f blue:234.0f / 255.0f alpha:1.0f] CGColor],
                        nil];

  [self.layer setMasksToBounds:YES];
  [self.layer setCornerRadius:5.0f];
  [self.layer setBorderWidth:0.8f];
  [self.layer setBorderColor:[[UIColor colorWithRed:200.0f / 255.0f green:200.0f / 255.0f blue:200.0f / 255.0f alpha:1.0f] CGColor]];

  [self.layer insertSublayer:btnGradient atIndex:0];
}
我的问题是,当调用上述函数时,渐变清晰可见,按钮具有所需的设计。但是,我也有一个没有字幕的按钮类型,我使用下面的其他类别功能设置

- (void)defaultButton
 {
  CAGradientLayer *btnGradient = [CAGradientLayer layer];
  btnGradient.frame = self.bounds;
  btnGradient.colors = [NSArray arrayWithObjects:
                        (id)[[UIColor colorWithRed:255.0f / 255.0f green:255.0f / 255.0f blue:255.0f / 255.0f alpha:1.0f] CGColor],
                        (id)[[UIColor colorWithRed:234.0f / 255.0f green:234.0f / 255.0f blue:234.0f / 255.0f alpha:1.0f] CGColor],
                        nil];

  [self.layer setMasksToBounds:YES];
  [self.layer setCornerRadius:5.0f];
  [self.layer setBorderWidth:0.8f];
  [self.layer setBorderColor:[[UIColor colorWithRed:200.0f / 255.0f green:200.0f / 255.0f blue:200.0f / 255.0f alpha:1.0f] CGColor]];

  [self.layer insertSublayer:btnGradient atIndex:0];
}
像以前一样使用viewdidload中调用的此函数将生成一个完全没有渐变或背景的按钮(该按钮具有清晰的背景色..我可以通过该按钮查看视图控制器的视图背景)


所有“我的按钮”都设置为带有图像和默认标题的自定义按钮。感谢您的帮助

找到了问题,尽管我不知道带字幕的代码为什么工作,但问题是,在启用自动布局的情况下,您的按钮在viewDidLoad方法期间还没有帧

当按钮有一个层时(如方法中),必须稍后应用渐变

viewDidLayoutSubviews
见: