2012-10-04 4 views
0

iOS 앱에 질감 버튼을 그려 넣고 싶습니다. 다른 크기의 버튼으로 작동하는 일반적인 솔루션을 원하기 때문에 CoreGraphics보다는 Photoshop을 사용하지 않을 것입니다. 그것의 기본 원리는 무엇입니까? 어떤 기술이 필요합니까?iOS에 질감이있는 단추를 그리려면 어떻게해야합니까?

내 첫 번째 단계는 UIButton을 서브 클래스 화하는 것이지만 어떻게하면 베벨 효과를 추가 할 수 있습니까?

+0

와 버튼의 배경색을 설정하려고이'[ UIColor colorWithPatternImage : yourTextureImage]; ' – George

+0

나는 편집 결과를 ewalized 한 후, 나는 bavil 효과에 대해 잘 모르겠다.하지만 button의 textlabel 속성을 사용할 수 있다고 생각한다. – ilhnctn

답변

3

가장 좋은 방법은 단추 클래스를 서브 클래스 화하는 것입니다 (새 클래스는 UIButton에서 상속해야 함). 이렇게함으로써 당신은

//interface of custom button class 
@interface myButton : UIButton 
    { 
     int orderNo; 

     CAGradientLayer *gradientLayer; 
     CALayer *wrapperLayer; 
     CGColorRef _borderColor; 

    } 
    @property (assign) int orderNo; 
    @property (nonatomic) CGColorRef _borderColor; 
    @property (nonatomic, retain) CALayer *wrapperLayer; 
    @property (nonatomic, retain) CAGradientLayer *gradientLayer; 

    - (void)setBorderColor:(CGColorRef)color; 
    - (void)setCornerRadius:(float)radius; 

구현 .. .. .. 아래는 샘플이 당신의 버튼에 너무 특화된 정보를 제공 할 수 있습니다

#import "Button.h" 

@implementation Button 
@synthesize orderNo,wrapperLayer,_borderColor,gradientLayer; 

- (id)initWithFrame:(CGRect)frame 
{if ((self = [super initWithFrame:frame])) { 
    CGFloat radius = self.bounds.size.width/2; 
    CGFloat borderWidth = self.bounds.size.width/10; 

    self.layer.backgroundColor = [[UIColor blackColor] CGColor]; 
    self.layer.borderColor = [[UIColor whiteColor] CGColor]; 
    self.layer.borderWidth = borderWidth; 
    self.layer.cornerRadius = radius; 

    if ([self.layer respondsToSelector:@selector(setShadowOffset:)]) 
     self.layer.shadowOffset = CGSizeMake(0.25, 0.25); 

    if ([self.layer respondsToSelector:@selector(setShadowColor:)]) 
     self.layer.shadowColor = [[UIColor blackColor] CGColor]; 

    if ([self.layer respondsToSelector:@selector(setShadowRadius:)]) 
     self.layer.shadowRadius = borderWidth; 

    if ([self.layer respondsToSelector:@selector(setShadowOpacity:)]) 
     self.layer.shadowOpacity = 0.75; 

    [self setNeedsDisplay]; 
} 
    return self; 
} 
- (void)drawRect:(CGRect)rect { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetShouldAntialias(ctx, true); 

    CGFloat xsize = self.bounds.size.width/6; 
    CGFloat borderWidth = self.bounds.size.width/10; 

    CGContextSaveGState(ctx); 

    CGContextSetLineCap(ctx, kCGLineCapRound); 
    CGContextSetLineWidth(ctx, borderWidth); 
    CGContextSetStrokeColorWithColor(ctx, [[UIColor whiteColor] CGColor]); 

    CGFloat width = self.bounds.size.width; 
    CGPoint start1 = CGPointMake(width/2 - xsize, width/2 - xsize); 
    CGPoint end1 = CGPointMake(width/2 + xsize, width/2 + xsize); 
    CGPoint start2 = CGPointMake(width/2 + xsize, width/2 - xsize); 
    CGPoint end2 = CGPointMake(width/2 - xsize, width/2 + xsize); 

    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, start1.x, start1.y); 
    CGContextAddLineToPoint(ctx, end1.x, end1.y); 
    CGContextStrokePath(ctx); 

    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, start2.x, start2.y); 
    CGContextAddLineToPoint(ctx, end2.x, end2.y); 
    CGContextStrokePath(ctx); 

    CGContextRestoreGState(ctx); 
} 
- (void)setBorderColor:(CGColorRef)color 
{ 
    [[self layer] setBorderColor:color]; 
    [[self layer] setNeedsDisplay]; 
} 

- (void)setCornerRadius:(float)radius 
{ 
    [[self layer] setCornerRadius:radius]; 
    // and get the wrapper for the gradient layer too 
    [wrapperLayer setCornerRadius:radius]; 
} 

@end 
+0

잘 이해하면 그림자와 작은 직사각형을 추가한다. . 그러나 내 비전은 '진짜'깊이를 버튼에 추가하는 것입니다. 베벨 효과는 다음과 같이 작동합니다. http://www.rw-designer.com/bevel-effect-explained –

+0

샘플을 제공하고 싶습니다. 답변을 편집합니다. – ilhnctn

관련 문제