2016-09-28 3 views
0

Я знаю, что если мы добавим заголовок после присвоения градиента кнопке в качестве подуровня, название кнопки будет впереди.Название кнопки идет за градиентным слоем

Но этот случай отличается.

Я меняю градиент для нормального состояния и нажал кнопки состояния.

Вот мой код:

-(void) buttonClicked:(UIButton*)sender{ 

    sender.backgroundColor = [UIColor clearColor]; 


    // Finding old gradient layer to remove it 
    for (CALayer *layer in [sender.layer.sublayers copy]){ 
     if ([[layer name] isEqualToString:@"gradientLayer"]) { 
      [layer removeFromSuperlayer]; 
     } 
    } 


    // Applying the new gradient 
    UIColor *colorTwo = [UIColor colorWithRed:1.00 green:0.81 blue:0.00 alpha:0.95]; // Original 
    UIColor *colorThree = [[UIColor brownColor] colorWithAlphaComponent:1]; 
    UIColor *colorFour = [[UIColor blackColor] colorWithAlphaComponent:0.9]; 
    CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
    gradientLayer.frame = sender.layer.bounds; 
    gradientLayer.colors = [NSArray arrayWithObjects: (id)[[UIColor whiteColor] colorWithAlphaComponent:0.5].CGColor,(id) colorTwo.CGColor,(id) colorThree.CGColor,(id) colorFour.CGColor, nil]; 
    gradientLayer.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:1.0f], nil]; 
    sender.layer.cornerRadius = 5; 
    gradientLayer.cornerRadius = sender.layer.cornerRadius; 

    // Adding gradient 
    [sender.layer addSublayer:gradientLayer]; 
    gradientLayer.name = @"gradientLayer"; 

    // Adding title after applying the gradient (BUT ALSO TITLE IS GOING BEHIND THE GRADIENT) 
    sender.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; 
    sender.titleLabel.numberOfLines = 2; 
    NSString *str = sender.titleLabel.text; 
    [sender setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
    [sender setTitle:str forState:UIControlStateNormal]; 


} 
-(void) touchedDown:(UIButton*)sender{ 

    // Finding old gradient layer to remove it 
    for (CALayer *layer in [sender.layer.sublayers copy]){ 
     if ([[layer name] isEqualToString:@"gradientLayer"]) { 
      [layer removeFromSuperlayer]; 
     } 
    } 

    // Applying the new gradient 
    CAGradientLayer *gradientLayer1 = [CAGradientLayer layer]; 
    gradientLayer1.frame = sender.layer.bounds; 
    gradientLayer1.colors = [NSArray arrayWithObjects: (id)[[UIColor whiteColor] colorWithAlphaComponent:0.5].CGColor, (id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor,(id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor, nil]; 
    gradientLayer1.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:1.0f], nil]; 
    gradientLayer1.cornerRadius = sender.layer.cornerRadius; 

    // Adding Gradient 
    [sender.layer addSublayer:gradientLayer1]; 
    gradientLayer1.name = @"gradientLayer"; 
    sender.backgroundColor = [UIColor blackColor]; 
    [sender setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
} 

В первый раз, когда я запустить приложение, заголовок на передней панели. Но когда я нажимаю на него, тогда заголовок уходит за градиентом. Пожалуйста, помогите мне с этой проблемой. Спасибо за время (:

ответ

3

Проблемы эта линия:

[sender.layer addSublayer:gradientLayer]; 

Это означает:.. Добавить слой с градиентом перед всеми другими подслоями Это включает в себя слой, который отображает указанную в заголовке метку

Вместо этого вызовите insertSublayer:atIndex: (или above: или below:) в положение слоя среди других слоев, где вы хотите его.

Однако, это было бы даже лучше не связываться с слоями кнопки напрямую. Вместо того, чтобы применять градиент в качестве слоя, нарисуйте градиент (в коде) на изображение и используйте это изображение в качестве фонового изображения кнопки.

Кроме того, вы можете настроить фоновое изображение для автоматического изменения , когда пользователь нажимает кнопку.

+0

Как найти индекс? –

+0

OMG Man .. Работал как шарм. Спасибо за информацию о 'insertSublayer: atIndex'. Большое спасибо. –

+0

Рад помочь, но похоже, что вы все еще устанавливаете слой вместо фонового изображения. Вы действительно не должны этого делать! :) – matt

Смежные вопросы