2016-09-28 2 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]; 
} 

처음에, 제목은 전면에 있습니다. 그러나 그것을 클릭하기 시작하면 제목이 그라디언트 뒤에 표시됩니다. 이 문제에 대해 친절히 도와주세요. 시간 (주셔서 감사 : 수단

[sender.layer addSublayer:gradientLayer]; 

:.

답변

3

문제점은이 라인이다. 다른 모든 서브 층 앞 경사 층 를 추가 타이틀 라벨을 표시 층을 포함

대신에, 당신이 그것을 원하는 다른 계층들 사이에서 레이어의 위치를 ​​insertSublayer:atIndex: (또는 above: 또는 below:)로 전화하십시오. 그러나

를, 그것은 것 단추의 레이어를 직접 사용하지 않는 것이 좋습니다. 그레디언트를 레이어로 적용하는 대신 그라디언트 (코드)를 이미지에 그린 다음 해당 이미지를 버튼의 배경 이미지로 사용하십시오.

또한 사용자가 버튼을 누르면 이 자동으로으로 변경되도록 배경 이미지를 구성 할 수 있습니다.

+0

색인을 어떻게 찾을 수 있습니까? –

+0

OMG 맨 .. 매력처럼 일했습니다. 'insertSublayer : atIndex'에 대한 정보를 가져 주셔서 감사합니다. 고마워. –

+0

도와 줘서 기쁩니다.하지만 배경 이미지 대신 레이어를 설정하는 것처럼 들립니다. 정말 그렇게해서는 안됩니다! :) – matt

관련 문제