Странная ошибка CAGradientLayer на UIButton

Я пытаюсь применить небольшой градиент ко всем кнопкам в моем приложении для iOS. Я создал категорию для UIButton, куда добавил эту функцию, которая в основном добавляет к кнопке подзаголовок, рамку и слой градиента.

Функция вызывается из-за загрузки:

- (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, как и раньше, приводит к тому, что кнопка вообще не имеет градиента или фона (кнопка имеет четкий цвет фона. Я могу видеть фон представления моего контроллера представления через кнопку).

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

}

Все мои кнопки настроены как пользовательские кнопки с изображением и заголовком по умолчанию. Спасибо за вашу помощь


person Bjergsen    schedule 15.04.2013    source источник


Ответы (1)


Нашел проблему, хотя не знаю, почему работает код с субтитрами, проблема в том, что при включенном авторазметке у вашей кнопки еще нет рамки во время метода viewDidLoad.

Градиент должен быть применен позже, когда будет слой для кнопки, такой как в методе

viewDidLayoutSubviews

см.: Невозможно сделать пользовательский UIButton в iOS6 с включенным автомакет раскадровки

person Bjergsen    schedule 15.04.2013