文章目录
需求要对某个视图进行水印遮罩效果,如果所有控件都需要,你可以考虑分类。
我这里使用 UIView
,你可以使用 CALayer
直接绘制。
使用CoreGraphic绘制
NSAttributedString
能够使用drawAtPoint
方法绘制到文本上CGContextSaveGState
通过Pop Push
上下文堆栈,避免影响其他- 通过
CGContextConcatCTM
可以进行二维变换,进行倾斜30度 - 倾斜后的视图无法铺满原视图,需要进行扩张
Code
//
// GSWaterMarkView.m
// GSWatermarkView
//
// Created by gensee on 2020/2/28.
// Copyright © 2020年 sheng. All rights reserved.
//
#import "GSWatermarkView.h"
#if !TARGET_OS_WATCH
#include <asl.h>
#include <notify.h>
#include <notify_keys.h>
#include <sys/time.h>
#import <libkern/OSAtomic.h>
#endif
#define LOG_DEBUG 1
@implementation GSWatermarkParam
@end
弧度转角度
//static inline double gs_radianToDegree(int radian) {
// return ((radian) * (180.0 / M_PI));
//}
//角度转弧度
static inline double gs_degreeToRadian(int angle) {
return ((angle) / 180.0 * M_PI);
}
@interface GSWatermarkView ()
@end
@implementation GSWatermarkView {
CGSize _textSize;
double _privateAngle;
dispatch_source_t _timer;
BOOL _isShow;
int durationCD;
int intervalCD;
// 检测是否是当次渲染的哨兵对象
int32_t _sentiel;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[self setup];
[self _cancelPreviousDraw];
}
return self;
}
- (instancetype)init {
if (self = [super init]) {
[self setup];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
[self _cancelPreviousDraw];
}
- (void)setup {
_privateAngle = 0;
_horizonSpacing = 10;
_verticalSpacing = 10;
// self.backgroundColor = [UIColor clearColor];
}
- (void)setRichtext:(NSAttributedString *)richtext {
if (richtext.length > 180) return;
_richtext = richtext;
_textSize = [_richtext boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size;
if (_timer) {
_timer = nil;
}
_isShow = YES;
[self _cancelPreviousDraw];
[self setNeedsDisplay];
}
- (void)_startTimer {
if (_timer) {
_timer = nil;
}
if (_duration > 0) {
if (_interval == 0) {
self.alpha = 1.f;
return;
}
}else {
self.alpha = 0.f;
return;
}
if (_timer) {
_timer = nil;
}
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0)