0

iOSアプリでテクスチャボタンを描きたいのですが。サイズの異なるボタンで機能する一般的なソリューションが必要なため、CoreGraphicsではなくPhotoshopを使用しません。その基本原理は何ですか?どのような技術が必要ですか?

私の最初のステップはUIButtonをサブクラス化することでしたが、どうすればそれに斜角効果を追加できますか?

4

1 に答える 1

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
于 2012-10-04T13:18:11.520 に答える