截图并保存
很显然,你要先截到自己想要的区域的图再谈保存的事,截图其实很简单:
- (IBAction)savePictureBtn_action:(id)sender {
//self.viewContentV 就是我要截取的内容所在
UIGraphicsBeginImageContextWithOptions(self.viewContentV.bounds.size,YES,0);
[self.viewContentV drawViewHierarchyInRect:self.viewContentV.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//这样再截一次就成了截图片的那么一点了。。。
UIImage *saveIm = [UIImage imageWithCGImage:CGImageCreateWithImageInRect([image CGImage], self.viewContentV.frame)];
//直接保存到相册,但是需要先检查下你的plist里是否获取了相册访问权限
//不然会崩的(10以后)
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void * _Nullable)(self));
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);
}
一些常用的权限获取:
如今苹果版粑粑审核愈加严格,获取任何权限都要说清楚将用来做什么,会不会泄漏用户隐私。切记要描述清楚,不然会被拒的
NSBluetoothPeripheralUsageDescription
“xxxx”需要获取您的蓝牙信息
NSCalendarsUsageDescription
“xxxx”需要获取您的日历权限
NSCameraUsageDescription
“xxxx”需要获取您的相机权限
NSContactsUsageDescription
“xxxx”需要获取您的联系人权限
NSLocationWhenInUseUsageDescription
“xxxx”需要获取您的位置信息
NSMicrophoneUsageDescription
“xxxx”需要获取您的麦克风权限
NSMotionUsageDescription
“xxxx”需要获取您的运动数据
NSPhotoLibraryUsageDescription
“xxxx”需要获取您的相册权限
两种添加方式就不细说了吧。。。
其实,对于这个方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
}
我是特别喜欢用的,但是有时候他就太勤快了,让人有些不爽。
比如这样一个页面:
除了中间小部分是table会拦截事件,哪怕点在total order#这样的lable上也会响应这个勤快的方法。然后这就影响了体验,而且怪怪的。
所以呢,咱就自己拦截不应该到最下层View的touch(关于手势的响应者链,请自行找度娘吧)
所以就有了我下面的这个玩法
//这两个单击手势的事件主是解决点击空白返回页面
//有些没事件拦截的地方,就被认为了“空白”。。。
- (IBAction)tapContenView_action:(id)sender {
}
- (IBAction)disMissTap_action:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{}];
}
最后说下这个页面的布局
其实很简单,就是内容稍微多了一点,用到的lable多了点。
然而,就是多了些控件,在你写约束的时候有没有感觉到脑袋大呢?
记得第一个带我的iOS老大就说过:相对复杂的布局就要模块化。下面就说下我是怎么对这个View进行约束的吧:
中间是table,可滚,也就是说约束的时候可以尽情的欺负这个table,满足头 尾之后的空间都是它的。
这样就大体分成了三个部分,尾部的四行还可以分成两部分。大概就是这样一块块去约束
一个框代表一个View,让约束相对独立了起来。不至于牵一发而动全身,而想对某个模块做整体修改的时候也会方便。