怎么做游戲推廣賺錢廊坊seo管理
把我之前發(fā)布在簡書的博客搬運過來。
目錄
- 場景
- 思路
- 具體實現(xiàn)
- 1. 自定義一個繼承自UILabel的IrregularLabel
- 2. 在初始化方法中進行相應初始化和設置
- 3. 在layoutSubviews方法中進行路徑的設置
- 最終效果
- 箭頭 label
場景
最近 App 改版,以下是截取的部分 UI 設計圖:
其中有一個不規(guī)則的 label
:
這個 label
頂部的兩個角是圓角,底部的兩個角是直角,底部還有一個小三角。
思路
CAShapeLayer
聯(lián)合 UIBezierPath
畫一個不規(guī)則的 layer
作為 label.layer
的 mask
。
具體實現(xiàn)
1. 自定義一個繼承自UILabel的IrregularLabel
#import "IrregularLabel.h"@interface IrregularLabel ()/** 遮罩 */
@property (nonatomic, strong) CAShapeLayer *maskLayer;
/** 路徑 */
@property (nonatomic, strong) UIBezierPath *borderPath;@end
2. 在初始化方法中進行相應初始化和設置
- (instancetype)initWithFrame:(CGRect)frame {if (self = [super initWithFrame:frame]) {// 初始化遮罩self.maskLayer = [CAShapeLayer layer];// 設置遮罩[self.layer setMask:self.maskLayer];// 初始化路徑self.borderPath = [UIBezierPath bezierPath];}return self;
}
3. 在layoutSubviews方法中進行路徑的設置
- (void)layoutSubviews {[super layoutSubviews];// 遮罩層frameself.maskLayer.frame = self.bounds;// 設置path起點[self.borderPath moveToPoint:CGPointMake(0, 10)];// 左上角的圓角[self.borderPath addQuadCurveToPoint:CGPointMake(10, 0) controlPoint:CGPointMake(0, 0)];// 直線,到右上角[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width - 10, 0)];// 右上角的圓角[self.borderPath addQuadCurveToPoint:CGPointMake(self.bounds.size.width, 10) controlPoint:CGPointMake(self.bounds.size.width, 0)];// 直線,到右下角[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width, self.bounds.size.height)];// 底部的小三角形[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2+5, self.bounds.size.height)];[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2, self.bounds.size.height-5)];[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2 - 5, self.bounds.size.height)];// 直線,到左下角[self.borderPath addLineToPoint:CGPointMake(0, self.bounds.size.height)];// 直線,回到起點[self.borderPath addLineToPoint:CGPointMake(0, 10)];// 將這個path賦值給maskLayer的pathself.maskLayer.path = self.borderPath.CGPath;
}
- 左上角的坐標是
(0,0)
- 右下角的坐標是
(maxX,maxY)
圓角是用的二次貝塞爾曲線,關于二次貝塞爾曲線,我在網(wǎng)上看到一張比較形象的圖:
3個點確定一個圓角。
最終效果
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.self.label = [[IrregularLabel alloc] initWithFrame:CGRectMake(90, 200, 200, 40)];[self.view addSubview:self.label];self.label.text = @"這是一個不規(guī)則label";self.label.textAlignment = NSTextAlignmentCenter;self.label.backgroundColor = [UIColor redColor];self.label.textColor = [UIColor whiteColor];self.label.font = [UIFont boldSystemFontOfSize:16];
}
效果圖:
箭頭 label
有讀者說要帶箭頭的 label:
其實思路是一樣的:
- (void)layoutSubviews {[super layoutSubviews];// 遮罩層frameself.maskLayer.frame = self.bounds;// 設置path起點[self.borderPath moveToPoint:CGPointMake(0, 10)];// 箭頭[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2-5, 10)];[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2, 0)];[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width/2+5, 10)];// 到右上角[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width, 10)];// 到右下角[self.borderPath addLineToPoint:CGPointMake(self.bounds.size.width, self.bounds.size.height)];// 到左下角[self.borderPath addLineToPoint:CGPointMake(0, self.bounds.size.height)];// 回到起點[self.borderPath addLineToPoint:CGPointMake(0, 10)];// 將這個path賦值給maskLayer的pathself.maskLayer.path = self.borderPath.CGPath;
}
如果想讓文本相對方形框居中,可以在 view
上放一個 label
。