美文网首页iOS
曹老师的iOS基础知识D

曹老师的iOS基础知识D

作者: CYC666 | 来源:发表于2017-11-14 10:50 被阅读25次

    {

    😠、引导界面

    sleep(1.5);

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    //查看版本号是否是最新的

    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];

    double version = [infoDict[@"CFBundleShortVersionString"] doubleValue];

    NSUserDefaults *userDefauls = [NSUserDefaults standardUserDefaults];

    //如果之前没有存储过,什么都取不出来,默认是0

    double lastVersion = [[userDefauls objectForKey:@"version"] doubleValue];

    // 如果版本号相比上次是最新的,则开启引导界面

    if (version > lastVersion) {//如果当前的版本比之前的版本要大

    //现实引导页面

    self.window.rootViewController = [[GuideViewController alloc]init];

    //更新沙盒路径中的版本信息

    [userDefauls setObject:@(version) forKey:@"version"];

    }else{

    self.window.rootViewController = [[MainTabbarController alloc]init];

    }

    }

    ==================================================================================================================================================

    {

    😡、CoreImage    (http://www.jianshu.com/p/384ec1beb30b)

    一、框架介绍:

    1).CoreImage

    2).是一个图像框架 他是基于OpenGL顶层创建 底层则用着色器来处理图像

    3).他利用GPU基于硬件加速处理图像

    4).CoreImage 中有很多滤镜

    5).它们能够一次给予一张图像或者视频帧多种视觉效果 -> 滤镜链

    6).而且滤镜可以连接起来组成一个滤镜链 把滤镜效果叠加起来处理图像

    二、CoreImage相关类的介绍

    1、CoreImage框架中最基本代表图像的对象。保存图像数据的类,可以通过UIImage,图像文件或者像素数据创建。创建类方法如下:

    imageWithContentsOfURL:

    imageWithData:

    imageWithCGImage:

    imageWithCVPixelBuffer:

    2、CIFilter滤镜类,图片属性进行细节处理的类,它对所有的像素进行操作 用键—值KVC来设置,值设置好,CIFilter就可以用来生成新的CIImage输出图像了。

    (1)、按效果分类

    kCICategoryDistortionEffect 扭曲效果,比如bump、旋转、hole

    kCICategoryGeometryAdjustment 几何开着调整,比如仿射变换、平切、透视转换

    kCICategoryCompositeOperation 合并,比如源覆盖(source over)、最小化、源在顶(source atop)、色彩混合模式

    kCICategoryHalftoneEffect Halftone效果,比如screen、line screen、hatched

    kCICategoryColorAdjustment 色彩调整,比如伽马调整、白点调整、曝光

    kCICategoryColorEffect 色彩效果,比如色调调整、posterize

    kCICategoryTransition 图像间转换,比如dissolve、disintegrate with mask、swipe

    kCICategoryTileEffect 瓦片效果,比如parallelogram、triangle

    kCICategoryGenerator 图像生成器,比如stripes、constant color、checkerboard

    kCICategoryGradient 渐变,比如轴向渐变、仿射渐变、高斯渐变

    kCICategoryStylize 风格化,比如像素化、水晶化

    kCICategorySharpen 锐化、发光

    kCICategoryBlur 模糊,比如高斯模糊、焦点模糊、运动模糊

    (2)、按使用场景分类:

    kCICategoryStillImage 用于静态图像

    kCICategoryVideo 用于视频

    kCICategoryInterlaced 用于交错图像

    kCICategoryNonSquarePixels 用于非矩形像素

    kCICategoryHighDynamicRange 用于HDR

    (3)、查询分类里面的效果,返回的是数组

    [CIFilter filterNamesInCategory:kCICategoryBlur];

    (4)、查询效果里面的属性

    [CIFilter filterWithName:XXX].attributes

    3.CIContext 上下文是实现对图像处理的具体对象——>(用来合成源图和滤镜) 滤镜对象输出的图像并不是合成之后的图像需要使用图像处理的上下文 合并输出的图像。

    三、基本使用

    1、使用步骤

    1).实例CIImage—>UIImage—>CGImageRef —> CIImage

    2).创建CIFilter滤镜并给滤镜设置属性(KVC)

    3).创建CIContext上下文

    4).合并滤镜输出的图像 ->得到一个合并之后的图像

    5).赋给UIImageView对象进行显示

    2、例子

    1)、创建CIImage

    CIImage *inputImage = [CIImage imageWithCGImage:imageView.image.CGImage];

    2)、查看kCICategoryColorEffect滤镜的效果分类

    NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryColorEffect]);

    3)、悬着其中一个类型,创建滤镜对象

    CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];

    4)、打印出来的是可以进行设置的属性以及设置时需要的属性

    NSLog(@"attributes===%@",filter.attributes);

    5)、滤镜效果设置,(如何找到常见的滤波器参数键 例如  kCIInputImageKey (按住command点击CIFilter 进入接口文件 165—191行都是效果分类))

    [filter setValue:inputImage forKey:kCIInputImageKey];    //必须有,滤镜操作的对象

    [filter setValue:[CIColor colorWithRed:0.8 green:0.5 blue:0.54 alpha:1] forKey:kCIInputColorKey];

    [filter setValue:@0.5 forKey:kCIInputIntensityKey];

    6)、创建CIContext上下文,这时已经生成带有滤镜的图像 但是没有合成 还是两部分 需要进行合成

    CIContext *context = [CIContext contextWithOptions:nil];

    7)、合并滤镜输出的图像,得到一个合并之后的图像

    CIImage *outputImage = filter.outputImage;

    CGImageRef imageRef =  [context createCGImage:outputImage fromRect:outputImage.extent];

    8)、显示到视图上

    imageView.image = [UIImage imageWithCGImage:imageRef];

    四、人脸识别 (http://www.jianshu.com/p/d9467ec6d746)

    1、构建方法,用于返回识别到脸的数量

    -(NSArray *)detectFaceWithImage:(UIImage *)faceImage

    {

    NSDictionary *opts = [NSDictionary dictionaryWithObject:

    CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];

    CIDetector *detectoer=[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:opts];

    CIImage *ciimage=[CIImage imageWithCGImage:faceImage.CGImage];

    NSArray *featrues=[detectoer featuresInImage:ciimage];

    if(featrues.count>0)

    return featrues;

    return nil;

    }

    2、在viewDidoad中实现

    - (void)viewDidLoad {

    [super viewDidLoad];

    //带人脸的照片

    UIImage *image=[UIImage imageNamed:@"face.jpg"];

    NSArray *results=[self detectFaceWithImage:image];

    //可能会存在多个脸部,这里只考虑一张脸的情况

    if(results.count>0)

    {

    CIFaceFeature *face=[results firstObject];

    if(face.hasSmile)

    NSLog(@"有微笑");

    if(face.leftEyeClosed)

    NSLog(@"左眼闭着的");

    if(face.rightEyeClosed)

    NSLog(@"右眼闭着的");

    if(face.hasLeftEyePosition)

    NSLog(@"左眼位置:%@",NSStringFromCGPoint(face.leftEyePosition));

    if(face.hasRightEyePosition)

    NSLog(@"右眼位置:%@",NSStringFromCGPoint(face.rightEyePosition));

    if(face.hasMouthPosition)

    NSLog(@"嘴巴位置:%@",NSStringFromCGPoint(face.mouthPosition));

    NSLog(@"脸部区域:%@",NSStringFromCGRect(face.bounds));

    if(face.bounds.size.width==face.bounds.size.height)

    NSLog(@"脸蛋是圆的-.-");

    }

    }

    }

    ==================================================================================================================================================

    {

    😤、宏定义那件小事

    1、屏幕的宽、高

    #define kScreenWidth  [UIScreen mainScreen].bounds.size.width

    #define kScreenHeight [UIScreen mainScreen].bounds.size.height

    2、版本号 判断版本号

    #define iOS7 ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0 && [[UIDevice currentDevice].systemVersion floatValue] < 8.0)

    #define iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0 && [[UIDevice currentDevice].systemVersion floatValue] < 9.0)

    #define iOS9 ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)

    3、不同屏幕宽、高比例系数

    #define kRatioWidth  kScreenWidth/320

    #define kRatioHeight kScreenHeight/568

    4、RGB快速取颜色

    #define RGB(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]

    #define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:a]

    }

    ==================================================================================================================================================

    {

    😖、UIApplication

    1、创建(单例类)

    [UIApplication sharedApplication];

    2、状态栏样式        statusBarStyle

    注意:务必在plist中添加View controller-based status bar appearance,设置为NO。若是YES,改不动

    在控制器中复写方法

    - (UIStatusBarStyle)preferredStatusBarStyle {

    returnUIStatusBarStyleLightContent;

    }

    或者:

    [[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleDefaultanimated:YES];

    3、是否隐藏状态栏    statusBarHidden

    在控制器中复写方法

    - (

    BOOL)prefersStatusBarHidden {

    returnYES;

    }

    4、状态栏大小        statusBarFrame

    5、APP图标的徽标数字值    applicationIconBadgeNumber

    注意:必须先设置消息通知

    6、

    // 设置标签控制器的徽标

    if (self.viewControllers.count >= 3) {

    UIViewController *viewCtroller = self.viewControllers[3];

    if (listArray.count == 0) {

    viewCtroller.tabBarItem.badgeValue = nil;

    } else {

    viewCtroller.tabBarItem.badgeValue = [NSString stringWithFormat:@"%ld", listArray.count];

    }

    }

    }

    ==================================================================================================================================================

    {

    😆、C语言常用函数

    1、scanf键盘输入:

    (1)、程序运行到当前代码,会停下来,等待键盘的输入,直到输入完然后按下return,程序才往下执行

    (2)、函数输入成功后的返回1

    2、

    }

    ==================================================================================================================================================

    {

    😋、cocoapods安装

    现在的mac系统已经默认安装好Ruby环境,那么下载和安装CocoaPods将十分简单,只需要一行命令。在Terminator(也就是终端)中输入以下命令:

    1、sudo gem install cocoapods

    但是,在终端中敲入这个命令之后,会发现半天没有任何反应。原因是那堵墙阻挡了cocoapods.org。

    解决办法是,我们可以用淘宝的Ruby镜像来访问cocoapods。按照下面的顺序在终端中敲入依次敲入命令:

    2、$ gem sources --remove https://rubygems.org/

    //等有反应之后再敲入以下命令

    3、$ gem sources -a http://ruby.taobao.org/

    为了验证你的Ruby镜像是并且仅是taobao,可以用以下命令查看:

    4、$ gem sources -l

    只有在终端中出现下面文字才表明你上面的命令是成功的:

    *** CURRENT SOURCES ***

    http://ruby.taobao.org/

    这时候,你再次在终端中运行:

    5、$ sudo gem install cocoapods

    等上十几秒钟,CocoaPods就可以在你本地下载并且安装好了,不再需要其他设置。

    6、$ pod setup

    出现

    Setting up CocoaPods master repo

    开始下载,可进入目录~/.cocoapods/

    使用du -sh查看下载进度,每隔一段时间查看一次

    某些环境原因导致pod更新不了,可能原因有,1)gem版本太低;2)github无法链接;3).cocoapods目录下的配置信息错误。我们可以一个一个来排除,

    首先更新gem到最新版本,在终端中输入:

    $ sudo gem update --system

    然后检查是否可以ping通github,在终端中输入:

    $ ping github.com

    然后查看pob repo list:

    $ pod repo list

    结果显示0 repos,说明没有安装成功;

    删除.cocoapods目录,重新下载pod更新:

    $ cd ~/.cocoapods/

    $ sudo -rm -rf ~/.cocoapods/

    }

    ==================================================================================================================================================

    {

    😷、发起通电

    1、调用 自带mail

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzlzh.com"]];

    2、调用 电话phone

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8008808888"]];

    3、调用 SMS

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];

    4、调用自带 浏览器 safari

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.hzlzh.com"]];

    调用phone可以传递号码,调用SMS 只能设定号码,不能初始化SMS内容。

    若需要传递内容可以做如下操作:

    }

    ==================================================================================================================================================

    {

    😎、传感器的使用

    一、加速度传感器

    1、创建    #import

    CMMotionManager *_cmm = [[CMMotionManager alloc] init];

    2、设置获取数据的频率 每隔一秒

    _cmm.accelerometerUpdateInterval = 1;

    3、判断传感器是否可用

    if (_cmm.accelerometerAvailable) {

    4、不断更新获取数据

    [_cmm startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {

    NSLog(@"%@", gyroData);

    }];

    5、当传感器处于活跃状态,关闭传感器

    if (_cmm.accelerometerActive) {

    _cmm.stopAccelerometerUpdates;

    }

    二、陀螺仪

    #import

    //设置陀螺仪更新数据周期

    _cmm.gyroUpdateInterval = 1;

    //当陀螺仪可用

    if (_cmm.gyroAvailable) {

    //开启陀螺仪更新数据

    [_cmm startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {

    NSLog(@"陀螺仪:%@", gyroData);

    }];

    }

    //关闭陀螺仪数据更新

    if (_cmm.gyroActive) {

    _cmm.stopGyroUpdates;

    }

    三、距离传感器

    #import

    //距离传感器 (传感器摄像头会识别障碍物,有东西时为yes,否则为no。例子:靠近时屏幕灭,远离屏幕时亮)

    //开启监听距离传感器

    [UIDevice currentDevice].proximityMonitoringEnabled = YES;

    //添加监听器

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(proximityChange)

    name:UIDeviceProximityStateDidChangeNotification

    object:nil];

    - (void)proximityChange {

    //获取传感器状态

    NSLog(@"当前距离传感器为:%d", [UIDevice currentDevice].proximityState);

    }

    //关闭距离传感器

    [[NSNotificationCenter defaultCenter] removeObserver:self];

    四、电源传感器    (跟距离传感器用法一致)

    #import

    [UIDevice currentDevice].batteryMonitoringEnabled = YES;

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(batteryChange)

    name:UIDeviceBatteryLevelDidChangeNotification

    object:nil];

    /*

    UIDeviceBatteryStateDidChangeNotification  电池状态的改变:是否连接上电源充电

    UIDeviceBatteryLevelDidChangeNotification  电池电量状态的改变

    */

    NSLog(@"电池电量:%.2f", [UIDevice currentDevice].batteryLevel);

    五、磁场传感器

    #import

    1、创建管理者

    CLLocationManager *_manager = [[CLLocationManager alloc] init];

    2、设置代理对象,并签订协议CLLocationManagerDelegate

    _manager.delegate = self;

    3、启动指南针更新程序

    [_manager startUpdatingHeading];

    4、代理方法

    已经更新指南针

    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    NSLog(@"%@", newHeading);

    //指南针_poinTto是指南针图片,改变角度

    _poinTto.transform = CGAffineTransformMakeRotation((180 - newHeading.magneticHeading)/180.0*3.1415926);

    }

    收起键盘的方法

    用于获取控制器比较困难的情况

    1、[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

    2、[[[UIApplicationsharedApplication]keyWindow]endEditing:YES];

    3、重写控制器的touchesBegin方法

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {

    [self.viewendEditing:YES];

    }

    4、调用响应控件的resignFirstResponder方法

    {

    1、UI界面更新必须回到主线程

    2、storyBoard、xib创建的界面,都不能用alloc-init访问,应该用UIStoryBoard-UIBundle访问

    3、先接受通知,后发送通知

    4、在Xcode中删除文件夹,有时会删除不彻底,导致拖入文件夹时产生同名冲突,应该show in finder在文件夹中删除

    5、状态栏就是个window,使用static修饰window,能保持一直存在

    6、https加密的方式是SSL

    7、nil:对象为空。nil对象调用方法什么都不会发生

    Nil:类为空。Nil调用类方法,什么都不会发送

    Class c = NSClassFromString(@“smsm”)

    Null\null\NULL:C语言中表示空

    8、MRR中是set方法,先判断新旧对象是否一样,若不一样,将旧对象release再将新对象retain或copy

    9、set、init都应该对对象retain一次

    10、KVC(key-value-coding)键值编码,可以不通过设置器方法直接给属性赋值,波坏了封装性

    11、KVO(key-value-observe)观察者模式

    属性不能直接赋值,应该使用set、kvc赋值,才能触发;添加多个观察者也只会响应同一个方法;每天加一个观察者,就应该移除一个观察者

    12、在info.plist中添加Localizations设置item为Chinese (simplified)。这样打开图片库或拍照的时候就可以显示简体中文了

    13、协议的默认方法是必须的@request

    }

    ———————————————————————————————————————————————零散的代码——————————————————————————————————————————————————————————————————

    {

    1、获取版本号

    [[UIDevice currentDevice].systemVersion floatValue]

    2、获取键盘高度

    1、监听键盘的弹出(键盘弹出,系统会发送通知)

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardshow:) name:UIKeyboardWillShowNotification object:nil];

    2、在接收通知的方法里获取

    - (void)keyboardshow:(NSNotification *)notification{

    NSLog(@"%@",notification);

    //取出键盘的frame

    CGRect frame = [notification.userInfo [UIKeyboardFrameEndUserInfoKey]CGRectValue];

    //获取高度

    CGFloat height = frame.size.height;

    }

    3、是否让scrollView对象从导航栏底部开始滑动(默认是允许的YES)

    self.automaticallyAdjustsScrollViewInsets = NO;

    4、状态栏的样式

    UIStatusBarStyleDefault

    UIStatusBarStyleLightContent

    //在控制器中复写方法

    - (UIStatusBarStyle)preferredStatusBarStyle;

    5、设置一个文件整个项目可用common,将文佳拖到该下地方(更换项目目录后,要重新拖拽)

    Build Settings -> Prefix Header

    6、利用字符串创建一个类的对象

    UIViewController *vc = [[NSClassFromString(TwoViewController) alloc] init];

    7、调节屏幕亮度(不局限于某个APP)

    [[UIScreen mainScreen] setBrightness:(0~1之间的浮点数)];

    }

    ==================================================================================================================================================

    代码块 快速开发

    ~/Library/Developer/Xcode/UserData/CodeSnippets

    {

    适配屏幕

    xib:

    1、让一个视图的宽高等比

    need-to-insert-img

    }

    判断两个区域是否有交集

    CGRectIntersectsRect(attribue.frame, rect);

    UICollectionViewFlowLayout 设置集合视图动画

    #pragma mark -当当前布局bounds发生改变时,让其他布局不发生改变- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {

    returnYES;

    }

    #pragma mark -前端页面的放大效果(布局时调用)

    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {

    //1.获取当前显示collectionview的区域和坐标CGRectvisibaleRect;

    visibaleRect.

    origin=self.collectionView.contentOffset;

    visibaleRect.

    size=self.collectionView.bounds.size;

    //2.调用父类方法获取当前rect中这些item的布局信息NSArray*attributes = [superlayoutAttributesForElementsInRect:rect];

    NSArray*safeAtteibutes = [[NSArrayalloc]initWithArray:attributescopyItems:YES];

    for(UICollectionViewLayoutAttributes*attribueinsafeAtteibutes) {

    if(CGRectIntersectsRect(attribue.frame, rect)) {//判断是否有交集(item是否进去系统检测范围之内)floatdistance =CGRectGetMidX(visibaleRect) - attribue.center.x;//获取当前item到中点的距离floatdiscale = distance/200;//放大倍数if(ABS(distance) <200) {

    floatscale =1+0.3*(1-ABS(discale));//凑数

    attribue.

    transform3D=CATransform3DMakeScale(scale, scale,1);//对空间三个方向进行放大

    attribue.

    zIndex=1;//更改在z轴的的位置

    }

    }

    }

    returnsafeAtteibutes;//返回放大后的效果图

    }

    剪切板 复制

    UIPasteboard *pasteboard =[UIPasteboard generalPasteboard];

    [pasteboard setString:[[self textLabel]text]];

    plist文件读写

    // 文件保存的地址分两种

    // 1、获取应用程序沙盒下的Documents目录(或其它目录)

    NSArray*pathArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString*path = [pathArrobjectAtIndex:0];

    //得到完整的文件名

    NSString*filePath = [pathstringByAppendingPathComponent:@"test.plist"];

    // 2、[NSBundle mainBundle]

    // NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist"];

    NSMutableDictionary*data = [[NSMutableDictionaryalloc]initWithContentsOfFile:filePath];

    NSLog(@"%@", data);

    // 添加一项内容

    [datasetObject:@"add some content"forKey:@"c_key"];

    // 文件写入

    if([datawriteToFile:filePathatomically:YES]) {

    NSLog(@"写入成功");

    }else{

    NSLog(@"写入失败");

    }

    // 那怎么证明我的数据写入了呢?读出来看看

    // 文件读取

    NSMutableDictionary*data1= [[NSMutableDictionaryalloc]initWithContentsOfFile:filePath];

    NSLog(@"%@", data1);

    相关文章

      网友评论

        本文标题:曹老师的iOS基础知识D

        本文链接:https://www.haomeiwen.com/subject/dzuxvxtx.html