2016-09-28 20 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人..工作就像一個魅力。感謝有關'insertSublayer:atIndex'的信息。非常感謝。 –

+0

很高興爲您提供幫助,但聽起來您仍在設置圖層而不是背景圖片。你真的不應該那樣做! :) – matt