iOS

iOS给一张照片美颜

之前我的一篇笔记iOS实时美颜并获取原图里面写了如何实现实时的美颜滤镜,本篇作为补充说下如何给一张图片美颜。 还是使用之前提到的GPUImageBeautifyFilter // 原图 UIImage * sourceImage = [UIImage imageNamed:@"notBeauty.png"]; GPUImageBeautifyFilter *beautyFilter = [[GPUImageBeautifyFilter alloc] init]; //设置要渲染的区域 [beautyFilter forceProcessingAtSize:sourceImage.size]; [beautyFilter useNextFrameForImageCapture]; //获取数据源 GPUImagePicture *stillImageSource = [[GPUImagePicture alloc]initWithImage:sourceImage]; //添加上滤镜 [stillImageSource

  • Nemo
    Nemo
2 min read
iOS

iOS实现实时美颜滤镜并获取原图

实时美颜 在iOS里面进行实时美颜,我使用的是GPUImageBeautifyFilter, 具体原理可以看作者的文章。 具体使用方法如下: 1.在项目的Podfile里面引入GPUImage target 'TestBeauty' do pod 'GPUImage' end 2.将GPUImageBeautyFilter.h和GPUImageBeautyFilter.m添加到项目中 3.编写相关代码 在ViewController.m里面实现如下代码: #import "ViewController.h" #import <GPUImage/GPUImage.h> #import

  • Nemo
    Nemo
6 min read
iOS

iOS调用UIImagePickerController相机拍照图片旋转了90度

以前遇到过iOS调用相机拍照图片旋转了90度的问题,照片显示在UIImageView里面是正常的,但是传输到服务器之后发现不是正的。 要解决上面这个问题,在发送图片到服务器之前,要对图片方向进行纠正。一般有两种方法进行纠正。 方法一、使用CGAffineTransform + CGBitmapContextCreateImage UIImage+fixOrientation.h文件 // UIImage+fixOrientation.h文件 #import <UIKit/UIKit.h> @interface UIImage (fixOrientation) - (UIImage *)fixOrientation; @end UIImage+fixOrientation.m 文件

  • Nemo
    Nemo
4 min read
iOS

安装cocoapods

很久没有碰xcode了,都有点忘记怎么在工程里面使用cocoapods了,下面主要是为了以后方便,在此做下记录。 1.确认是否需要使用cocoapods 假如说从github上下了一个项目,看里面是否有xxx.xcworkspace文件或者Podfile文件,有就是需要使用cocoapods 2.如何使用cocoapods 2.1 确认你已经安装了pod工具 在terminal里面输入命令pod --version,查看是否已经安装pod工具 如果没有安装,则按照以下步骤进行安装: gem update --system升级ruby环境 替换ruby镜像 gem sources --remove https://rubygems.org/ gem source -a

  • Nemo
    Nemo
1 min read
iOS

iOS-记一次因内存泄露引起的崩溃

最近玩儿了一下百度人脸识别的功能,申请了iOS SDK放到了测试的app里面。本来都运行得挺好的,把人脸识别的界面放在那儿,中午出去吃个饭回来发现app崩溃了!!!这就要找一下原因了,肯定不是什么每次都必现的bug,不然不可能一开始好好的,后来却崩溃了。一、查看设备上面的日志 把设备连上电脑,打开Xcode -> Windows -> Devices and Simulators,找到相应的设备,点击View Device Logs。看了一下,只有一些前几天的crash日志,和一些unkown的没有日期的日志。这条路是看不出什么了。二、集成SDK统计崩溃信息我先是集成了百度移动统计的SDK,QA帮忙测了一会儿说又崩溃了,

  • Nemo
    Nemo
2 min read
iOS

iOS keychain

用户名密码不能保存在NSUserDefault里面,这个应该是共识。一般是把重要的东西存在keychain里面,keychain是可以被破解的,最好不要明文存储。 keychain里的东西是存在于每个app的沙盒之外的,所以keychain里保存的信息不回因app卸载而丢失。 使用Keychain需要引入Security.framework框架 苹果官方有个GenericKeychain示例代码,不过它不是ARC的,用的时候在Building Phases-> Compile Sources里面找到KeychainItemWrapper.m,给它添加上标志-fno-objc-arc。 假如说你只是要保存个用户名密码,那么使用KeychainItemWrapper就够了,具体的用法如下: 1.首先创建一个KeychainItemWrapper对象 KeychainItemWrapper * wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"myKeychainIdentifier" accessGroup:nil]

  • Nemo
    Nemo
3 min read
iOS

使用performSelector或者NSInvocation调用方法

有时候,写程序的时候会用到自己以前写的东西,但某些接口是不对外开放的,只有我自己知道。这个时候,可以使用如下方法来调用那些实际存在但被藏起来的方法。 objc_msgSend 根据objective-c的运行时特性,向某个对象或对象的实例发送消息,最终调用的其实是objc_msgSend。 objc_msgSend(receiver, selector, arg1, arg2, …); 第一个参数为方法的接收对象,第二个参数为SEL,后面是方法需要的参数。 performSelector 最多带两个参数,且参数为object,不能是int之类的基础类型 新建一个工程,在ViewController.m里面定义一些方法 - (void)function0 { NSLog(@"

  • Nemo
    Nemo
2 min read
iOS

sort array of dictionary

对存放着字典的数组排序 其实是类似于给excel表格排序。NSArray里面有一些元素,这些元素都是NSDictionary,每个元素的keys都是一样的,想要对这样的数据来排序,可以使用到NSSortDescriptor 我先是看到NSHipster上的这篇文章,它是新构造一个类,每个key都是这个类的一个属性,使用如下代码来排序: @interface Person : NSObject @property NSString *firstName; @property NSString *lastName; @property NSNumber *age; @end @implementation Person - (NSString *)description { return [NSString stringWithFormat:@"

  • Nemo
    Nemo
3 min read
iOS

NSTimer相关

首先看一下官方文档上对于NSTimer的介绍 创建 首先看一下创建NSTimer的方法,有以下几个,前面四个都是类方法,后面一个是实例方法。 + scheduledTimerWithTimeInterval:invocation:repeats: + scheduledTimerWithTimeInterval:target:selector:userInfo:repeats + timerWithTimeInterval:invocation:repeats: + timerWithTimeInterval:target:selector:userInfo:repeats: - initWithFireDate:interval:target:selector:userInfo:repeats: 在这些里面一般第一个和第三个不太常用,因为NSInvocation很少用到。 看一下第二个方法 + (NSTimer

  • Nemo
    Nemo
13 min read
iOS

在OC中怎样使用单例

单例的使用 在iOS里面有很多使用单例的地方,比如NSUserDefault,NotificationCenter等。如果我们自己要使用单例模式的话,应该怎么办呢? 会造成非单例的构造方法: 这种创建方法,在多线程情况下会出错,如下图所示: 打印出如下两个图所示,有时候确实是单例,但有时候却是不同的两个实例: 究竟是在哪里出了问题呢?%>_<%,如下图所示,假如两个线程同时去判断single是不是nil,而此时必然是nil,则都会去生成相应的对象。 解决办法: 方法一、给获取单例那段代码加上 @symchronized(self)修饰符,则同一时间只能有一个线程访问这段代码 方法二、使用GCD 避免滥用单例 单例确实很方便,但是也会有很纠结的一面。比如说,

  • Nemo
    Nemo
2 min read
iOS

iOS NSURLRequest GET POST

iOS里面用NSURLRequest、NSURLMutableRequest来表示一个请求,可以进行一些基本的设置。 有几种初始化的方法: + (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;参数分别是URL,缓存策略,超时时间 - (instancetype)initWithURL:(NSURL *)URL;参数是URL - (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)

  • Nemo
    Nemo
4 min read
iOS

iOS respond chain

iOS 事件响应 当用户产生一个事件,app就需要对这个事件进行响应。一个事件会经历一条特定的路径直到传递到能够处理它的对象处。一开始,UIApplication的单例将头部的事件从事件队列里面取出来,分发给能够处理它的对象,一般是keywindow。如果是触摸类的事件,那么keywindow首先会尝试将事件传递给触摸发生的视图(可以通过hit-test来找到触摸发生的视图)。如果是动作或者远程控制类的事件,keywindow会传递给first responder进行处理。 所有的事件路径,它的终极目标就是为了找到一个能处理并响应该事件的对象。 hit-testing找到发生触摸事件的视图 看官网上的这张图, 1.触摸发生在视图A内,那么就检查A的子视图B和C。 2.触摸发生在子视图C内,不在子视图B内。那么就去检查视图C的子视图D和E,不再去检查B的子视图。 3.触摸发生在视图E中,不在视图D中,且E没有子视图是包含这个触摸点的,那么E就是我们要找的触摸发生的视图。 此处有一个要注意的,

  • Nemo
    Nemo
6 min read
iOS

iOS NSUserDefault

介绍 一开始看学习iOS的时候,书上介绍说这是一种轻量级持久化数据的方法,可以用来保存用户设置及用户名、密码等。看Android的时候也是这样介绍sharedPreference的。现在想来当时真是yong&simple。 使用NSUserDefault的好处是不用自己创建、维护一份文件,全由系统帮你做,向其中读写内容也甚是方便。 虽然都介绍说这是一种轻量级的方法,但谁也不能拦着你往里面放大量数据。 NSUserDefault的大小理论上是磁盘有多大它就可以有多大。但如果每次都存放很多数据,并且频繁读写的话,也是很影响性能的。 位置 使用xcode进行开发的时候,可以用finder打开/Users/yourname/Library/Developer/CoreSimulator,进到里面,根据com.xxx.xxx.plist搜索一下就能找到相应的文件了。 什么时候会被删除

  • Nemo
    Nemo
3 min read
iOS

《Objective-C高级编程 iOS与OS X多线程和内存管理》笔记——GCD部分

以前在iOS里面使用多线程的时候基本都会使用performSelectorInBackground,感觉用着挺好啊,这对简单的程序来说基本就够用了,不需要用到NSThread什么的,也不会想到要去用GCD。o(╯□╰)o GCD dispatch_async dispatch_async的官方文档是这么说的 Submits a block for asynchronous execution on a dispatch queue and returns immediately. void dispatch_async( dispatch_queue_t queue, dispatch_

  • Nemo
    Nemo
11 min read
iOS

iOS TextField

整理一下TextField常用的一些属性 首先来看一下TextField在xib的Attributes inspector里面的一些属性 先来看几个显而易见的,比如说: 你在Text里面填的内容就是这个可编辑输入框的内容。Text可以是Plain或者Attributed的。如果设置Text是Attribute的,那么界面就会变成这样 Color 就是文字的颜色 Font 就是字体。 Aligment 文字在框内的对其方式 Placeholder 即没有内容的时候呈现在框里的信息,一般用于提示。比如说“没有密码可不填”等。 Background当textField为enable的时候显示的背景图片。 Disabled当textField为disabled的时候显示的背景图片 Border style 边框的类型。从左往右分别是没有边框、直角边框、直角带阴影的边框、圆角边框。(我个人觉得圆形边框比较好看) Clear Button

  • Nemo
    Nemo
9 min read
iOS

iOS UIPickerView

Android里面有下拉列表控件,但是iOS里面没有下拉列表,可以使用滚轮控件(UIPickerView)来实现这种功能。 使用滚轮控件UIPickerView类似于使用UITableView,需要实现两个代理UIPickerViewDelegate和UIPickerViewDataSource里面的方法。可以看官网的文档 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;用来设置有几个滚轮。(日历控件一般是三个滚轮,而我要实现下拉列表的话,一个滚轮就行。) - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;表示某个滚轮里面有多少行。 - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)

  • Nemo
    Nemo
4 min read