很久没有写东西了,其实有好多心得啊,小干货什么的想记录下来。懒,也是太浮躁了、沉淀下来不容易....
图片的合并(添加水印)
项目里面有个分享图片到朋友圈的功能。要求是给要分享的图片添加水印。大概就是把App应用的图片标签合成上去了。
用到的是UIKit里的UIImage context,即苹果提供的以下几个方法。
UIKIT_EXTERN void UIGraphicsBeginImageContext(CGSize size);
UIKIT_EXTERN void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN UIImage* __null_unspecified UIGraphicsGetImageFromCurrentImageContext(void);
UIKIT_EXTERN void UIGraphicsEndImageContext(void);
参数 | 含义 |
---|---|
size | 新创建的位图、上下文的大小 |
opaque | 是否透明,如果图形完全不用透明,设置为YES以优化位图的存储。 |
scale | 缩放比例 |
UIGraphicsBeginImageContext
和UIGraphicsBeginImageContextWithOptions
相比是参数的不同,功能是相同的,相当与opaque参数为NO,scale参数为1.0。
有了这几个方法,我们可以对UIImage做很多事情了。例如对图像等比缩放、重定义图像的大小、等等....
而图片的合并也类似,使用的代码不多。可以把这段代码写到工具类里面,使用的时候直接调用。
/*print:添加的图片;Origin:原始图片;*/
+ (UIImage *)addPrintImg:(UIImage *)print toOriginImg:(UIImage *)Origin
{
//绘制位图的大小
UIGraphicsBeginImageContext(Origin.size);
//Draw Origin
[Origin drawInRect:CGRectMake(0, 0, Origin.size.width, Origin.size.height)];
//Draw print
[print drawInRect:CGRectMake(40, Origin.size.height-print.size.height*1.5-40, print.size.width*1.5, print.size.height*1.5)];
//返回的图形大小
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
//end
UIGraphicsEndImageContext();
return resultImage;
}
- 实际使用中,可根据所需的来设置Origin、print的rect。
- 需要注意的是:UIGraphicsGetImageFromCurrentImageContext方法不是线程安全的,操作太频繁的话,对于大图片的处理肯定会消耗大量的时间。
- 对线程安全要求高的话最好使用CoreGraphics来操作图像。
GCD倒计时
分享一段网上找的,使用GCD来倒计时代码。感觉还是挺好用的。
直接上代码:
+ (void)verificationCode:(void(^)())blockYes blockNo:(void(^)(id time))blockNo
{
//设置倒计时时间
__block int timeout = 60;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(_timer, ^{
if(timeout <= 0) {
//倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
blockYes();
});
} else {
// int minutes = timeout / 60;
int seconds = timeout % 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//NSLog(@"验证码剩余时间%@",strTime);
blockNo(strTime);
});
timeout--;
}
});
dispatch_resume(_timer);
}
⚠
使用起来好像也没什么问题
- 如果是在UIbutton按钮上面使用GCD进行倒计时的话,会一闪一闪的(有点闪烁的效果)。
- 如果不想它闪烁的话,可以在按钮上面添加UILabel来倒数,或者将UIButton的UIButtonType设置为UIButtonTypeCustom
欢迎关注我的GitHub:点这里哦