#import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @interface UIView (Shape) - (void)setShape:(CGPathRef)shape; @end
#import "UIView+Shape.h" @implementation UIView (Shape) - (void)setShape:(CGPathRef)shape { if (shape == nil) { self.layer.mask = nil; } CAShapeLayer* maskLayer = [CAShapeLayer layer]; maskLayer.path = shape; self.layer.mask = maskLayer; } @end
@interface UIBezierPath (BasicShape) + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length; @end
#import "UIBezierPath+BasicShape.h" @implementation UIBezierPath (BasicShape) + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length { CGRect rect = originalFrame; UIBezierPath *bezierPath = [UIBezierPath bezierPath]; [bezierPath moveToPoint:CGPointMake(0, length)]; [bezierPath addLineToPoint:CGPointMake(length, 0)]; [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, 0)]; [bezierPath addLineToPoint:CGPointMake(rect.size.width, length)]; [bezierPath addLineToPoint:CGPointMake(rect.size.width, rect.size.height - length)]; [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, rect.size.height)]; [bezierPath addLineToPoint:CGPointMake(length, rect.size.height)]; [bezierPath addLineToPoint:CGPointMake(0, rect.size.height - length)]; [bezierPath closePath]; return bezierPath; } @end
在[UIView viewWillAppear:]方法中加入下面代碼
[self.view setShape:[UIBezierPath cutCorner:self.view.bounds length:40].CGPath];
效果:
################
讓自定義 Button 響應自定義 Shape 內的點擊事件
#import <UIKit/UIKit.h> #import "UIView+Shape.h" #import "UIBezierPath+BasicShape.h" @interface RFButton : UIButton{ CGPathRef path; } @end
// // RFButton.m // ChristApp // // Created by Haozhen Li on 13-12-6. // // #import "RFButton.h" @implementation RFButton - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (void)setShape:(CGPathRef)shape { [super setShape:shape]; path = shape; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { if (CGPathIsEmpty(path)) { return YES; } //判斷觸發點是否在規定的 Shape 內 if (CGPathContainsPoint(path, nil, point, nil)) { return YES; } return NO; } @end