iOS开发
iOS开发过程中的一些心得和总结。
浅浅青丘
动手是解决问题的最好方法。
展开
-
iOS9 无法加载http网络请求的问题
在Info.plist中添加NSAppTransportSecurity类型Dictionary。在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES原创 2016-02-19 16:38:42 · 421 阅读 · 0 评论 -
多线程中队列和同/异步执行问题
队列分为并行队列和串行队列,执行方式分为同步执行和异步执行,那么组合一下就有四种方式,下面我会用GCD来验证和总结一下各个组合的特性。并发队列,同步执行//并发队列+同步执行//不会开启新线程,任务顺序执行-(void)test1{ NSLog(@"并发队列+同步执行"); //DISPATCH_QUEUE_CONCURRENT 并发队列 dispatch...原创 2018-08-30 11:47:28 · 1862 阅读 · 0 评论 -
Xcode真机调试常碰到的问题
1、原因:修改了Build Settings→Packagin→Produce Name.修改这个主要是为了修改APP在主屏幕上的名称,因为大多数人在建立工程的时候,都是使用英文名,但app的名字一般都是中文的,所以很多人会修改这个属性。解决方案不要修改这个属性,修改app在主屏幕上的名字有一个其他的方法。打开工程的infor.plist文件,新增一行(Bu原创 2016-03-18 14:04:26 · 3364 阅读 · 0 评论 -
Xcode删除证书和清理编译项目产生的缓存
1???Xcode??????provisioning profile ??Finder??????~/Library/MobileDevice/Provisioning Profiles???????????????2???Xcode??????????? ??Finder??????~/Library/Developer/Xcode/DerivedData???????原创 2016-03-18 16:36:12 · 2857 阅读 · 0 评论 -
Swift Mark的使用
在用Objective-C开发iOS的时候,常常用到#pragma mark -,使用Mark可以让代码看上去整洁,提高了代码的可读性。 最近开始写Swift,发现不能再这样写了,这样写直接报错。Swift下的Mark://MARK:-阅读代码时,我习惯先看每个类中的方法,只要方法名不是乱起,一般看完方法名基本知道这个类主要是干什么以及它的实现逻辑,所以加了Mark能让代码更清晰,这...原创 2018-07-09 16:14:59 · 3599 阅读 · 0 评论 -
iOS使用UIScrollView实现图片循环滑动的思路解析
一组图片循环滑动在开发中经常用到,App的欢迎页、广告banner等等都会用到。成熟的第三方也比较多,个人用的比较多的是JCTopic,这个很轻量级,代码也不多,用起来也是比较方便。 看过源码之后整理了一下实现的思路和原理,我们先来分析一下我们要实现的这个功能——图片循环轮播,看到这个需求我们想到的就是一组图片能够左右滑动,并且无限循环。 要实现这个功能,我们肯定需要一个可滑动的view,那么...原创 2018-07-11 16:46:00 · 3533 阅读 · 0 评论 -
iOS常用方法——NSArray、NSDictionary与json的相互转换
开发中常用到NSArray、NSDictionary转换为json格式和json解析为NSArray、NSDictionary。不多说,直接上干货。NSArray、NSDictionary转换为json:+(NSString *)objectToJson:(id)obj{ if (obj == nil) { return nil; } NSE...原创 2018-06-21 15:00:37 · 12290 阅读 · 0 评论 -
iOS常用方法——URL编码和URL解码
URL编码是一种常见的编码方式,作用不多说,直接上代码。URL编码: - (NSString *)URLEncodedString{ // CharactersToBeEscaped = @":/?&=;+!@#$()~',*"; // CharactersToLeaveUnescaped = @"[]."; NSString *unencode...原创 2018-06-21 15:25:04 · 12915 阅读 · 1 评论 -
iOS常用方法——sha1编码和MD5编码
对string进行sha1编码:-(NSString *)stringWithSha1Encode{ const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:self.length]; ...原创 2018-06-21 15:43:35 · 1011 阅读 · 0 评论 -
iOS常用方法——判断图片类型
直接用图片的后缀来判断图片的类型不一定准确,用下面的方法可以准确的判断出图片的类型。+(NSString *)contentTypeForImageData:(NSData *)data{ uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: r...原创 2018-06-21 15:57:27 · 2330 阅读 · 0 评论 -
iOS常用方法——一个好用的获取导航栏高度和Tabbar高度的分类
开发中经常需要知道导航栏(系统)的高度和Tabbar的高度,一般是用来计算在ViewController中的位置和高度,我们可以写一个UIVIewController的分类,这样在调用的时候就很方便。代码如下:#import "UIViewController+MYViewControllerBar.h"@implementation UIViewController (MYViewC...原创 2018-07-10 10:06:11 · 16765 阅读 · 0 评论 -
iOS创建系统TabBar
大部分iOS的app都会用到tabBar,创建代码也都差不多,贴出代码,方便写新项目时过来粘贴代码#import "MainTabBarViewController.h"#import "HomeViewController.h"#import "ClassifyViewController.h"#import "ShoppingCartViewControll原创 2016-02-23 13:34:47 · 766 阅读 · 0 评论 -
iOS系统异步请求封装
在iOS开发中,我们经常会遇到网络请求的问题,AFNetworking是一个很不错的第三方库。当然iOS系统也有自己的网络异步请求类——NSURLConnection,虽然每次用的时候都要写代理,但是封装一下之后还是很好用的。封装的这个类除了完成异步网络请求,还加入了MD5的加密以及本地缓存。// HttpDownLoadBlock.h#import @i原创 2016-02-23 13:55:00 · 558 阅读 · 0 评论 -
iOS状态栏UIStatusBar详解
ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分:前景部分:就是指的显示电池、时间等部分;背景部分:就是显示黑色或者图片的背景部分;一、设置statusBar的【前景部分】简单来说,就是设置显示电池电量、时间、网络部分标示的颜色, 这里只能设置两种颜色:默认的黑色(UIStatusBarStyleDefault)白色(原创 2016-03-03 09:54:24 · 1491 阅读 · 0 评论 -
iOS 系统图片详解
iOS 获取图片有三种方法1 直接调用摄像头拍照2 从相册中选择3 从图库中选择UIImagePickerController 是系统提供的用来获取图片和视频的接口;用UIImagePickerController 类来获取图片视频;大体分为以下几个步骤:初始化UIImagePickerController 类 设置UIImagePicke转载 2016-04-15 11:16:39 · 777 阅读 · 0 评论 -
iOS单元测试
由于只是一些简单实用的东西,学学还是挺不错的。其实单元测试用的好,开发起来也会快很多。单元测试对于我目前来说,就是为了方便测试一些功能是否正常运行,还有调试接口是否能正常使用。有时候你可能是为了测试某一个网络接口,然后每次都重新启动并且经过很多操作之后才测试到了那个网络接口。如果使用了单元测试,就可以直接测试那个方法,相对方便很多。 比如由于修改较多,我们想测试一下分享功能是否正常,这时候就有用了转载 2017-04-15 16:29:37 · 375 阅读 · 0 评论 -
AFNetWorking 网络错误码大全
NSError codes in the Cocoa error domain.enum { NSFileNoSuchFileError = 4, NSFileLockingError = 255, NSFileReadUnknownError = 256, NSFileReadNoPermissionError = 257, NSFileReadInvalidF原创 2017-05-22 22:23:42 · 5291 阅读 · 0 评论 -
横向分页滚动的UICollectionView,cell左右排版
做IMl聊天,实现自定义表情功能的时候,需要实现微信聊天时那样的表情排版,主要要实现collectionView能横向滑动cell左右排版。默认的cell排版方向是跟随滚动方向的,例如竖向滚动的话,cell的排版是从左到右、从上到下;横向滚动的话,cell是从上到下、然后从左到右。那么要实现collectionView横向滚动,cell从左到右、从上到下的排版,只需要自定义重写下collectio原创 2017-06-12 19:00:00 · 8231 阅读 · 0 评论 -
在子线程中初始化地图会出现的警告以及解决方法
项目中用到高德地图定位,每次登录之后和当app进去前台时,我都会调用一下更新位置。为了不卡主线程,我就把这个操作放在了子线程,然后用的是自己封装的一个地图类来进行位置的更新。一开始代码是这样写的:然后控制台总会出现以下的警告:最后我是把map的初始化拿到了子线程外面,然后消除了警告。原创 2017-06-13 16:19:54 · 515 阅读 · 0 评论 -
iOS系统导航栏设置leftBarButtonItem和rightBarButtonItem的位置
我们都知道在使用系统导航栏的leftBarButtonItem和rightBarButtonItem的时候,我们自己给的位置坐标是没有用的,这两个按钮是系统定义好的,位置也是定义好的。那么我们会发现,如果直接使用系统的leftBarButtonItem和rightBarButtonItem,他们距离屏幕边缘的距离是很大的,效果图如下: 这样的效果有可能觉得离得屏幕边缘太远了,更多的可能希望效果原创 2017-08-17 14:52:21 · 11046 阅读 · 0 评论 -
AFNetworking怎么post x-www-form-urlencoded类型的数据
最近接手一个项目,看到网络请求那一块很奇怪,具体情况见下面的截图: 然后发现项目里,只要带参的请求都是用的方法三发起的,不带参的都是用第二个方法发起的,第一个方法是我自己拿来测试的。 由于我之前都是用第二个方法发起post请求的,而且第二个方法一般都是用来上传文件和图片的,感觉很奇怪。 经过多方查找和调试,才知道我们服务器的content-type只支持post x-www-for原创 2017-08-23 11:25:47 · 7117 阅读 · 2 评论 -
iOS白名单和系统权限的配置
iOS 9后用到第三方时需要将在“Info.plist”中将要使用的URL Schemes列为白名单。常用第三方白名单,在“Info.plist”里增加如下代码:<key>LSApplicationQueriesSchemes</key> <array> <!-- 微信 URL Scheme 白名单--> <string>wechat</string> <string>we原创 2017-08-24 10:37:13 · 2018 阅读 · 0 评论 -
iOS用UIBezierPath给控件削圆角
给控件做圆角效果在开发中很常见,我们都知道直接用layer的方法也是可以裁剪的,但是性能不是很好,下面我给出两个常用的用UIBezierPath来裁剪圆角的方法。 一、全角(四个角都做裁剪)/* view:裁剪的控件 cornerRadius:圆角的大小*/+(void)cutCornerRadius:(UIView *)view andRadius:(CGFloat)cornerRadi原创 2017-08-28 14:18:29 · 1661 阅读 · 0 评论 -
iOS UIView的圆角加阴影效果的实现
最近项目的界面都要改成卡片的形式,即需要投影的效果,还要削出圆角,我们都知道削圆角一般有两种方式,一种是直接用layer.cornerRadius来设置,我们知道的一般都是下面两行代码一起使用来实现圆角:self.layer.cornerRadius = 10;self.layer.masksToBounds=YES;但是只要self.layer.masksToBounds=YES;有这句,投影的原创 2017-09-11 22:30:00 · 24649 阅读 · 0 评论 -
初识Runtime之KVO实现原理
Runtime运行时是在iOS代码运行时将其翻译成对应的C语言程序。 Runtime 运行时是苹果提供的一个API,属于一个C语言的库。那么在iOS开发中,Runtime运行时有什么用呢? 1. 利用Runtime运行时,在程序的运行过程中,动态创建一个类。 2. 利用Runtime运行时,在程序的运行过程中,动态修改一个类的属性/方法。 3. 利用Runtime运行时,遍历一个类的所原创 2017-09-18 19:10:01 · 1327 阅读 · 0 评论 -
iOS多线程理论
pthread 特点: 1)一套通用的多线程API 2)适用于Unix\Linux\Windows等系统 3)跨平台\可移植 4)使用难度大 使用语言:c语言 使用频率:几乎不用 线程生命周期:由程序员进行管理NSThread 特点: 1)使用更加面向对象 2)简单易用,可直接操作线程对象 使用语言:OC语言 使用频率:偶尔使用 线程生命周期:由程序员进行管理GCD 特原创 2017-10-18 11:29:47 · 330 阅读 · 0 评论 -
iOS 控件截图、MP4格式视频流和m3u8格式视频流截取某一帧功能的实现
最近开发遇到一个点击按钮实现直播视频流截屏的功能,去网上查了一下资料,总结了一下iOS中截屏相关的知识,然后自己做了个demo。 demo主要实现了3种截屏方法,分别对应三种不同的应用场景。 1、imageView截图,这个截图方法可以用来实现截取项目中的控件,可截取的控件可包括UIImageView、UIView等。截图方法如下:-(UIImage *)screenshotsWith原创 2018-01-12 17:16:16 · 3235 阅读 · 0 评论 -
浅谈App开发iOS端的架构设计
本文将要讲的架构设计可能没有那么真正的架构那么准确,可以理解为在创建App时项目的一个目录结构吧。 做iOS开发3年,其实深刻的架构设计感觉还谈不上,主要是现在接手了一套架构比较牛的代码,然后回头看了一下自己之前的App架构,觉得豁然开朗了很多。在这里主要总结分享一下我自己写过的比较渣的架构,希望大家以此为鉴! 第一份工作的第一个App,那个时候知道的架构也只有MVC模式,但是可能理解的也不是原创 2018-01-24 12:55:58 · 6708 阅读 · 2 评论 -
iOS开发编码规范小结
规范编码可以提高代码的可读性,降低维护成本。作为一个程序员,要对自己写的代码负责,虽然bug无可避免,但是写代码时最基本的编码规则还是应该遵守的,否则不是坑自己就是坑别人,因为代码肯定是要维护的。 下面我主要讲一下从建项目到开发写代码时应该注意的一些地方和自己的一点建议。项目名称:项目名字的英文或者拼音全拼形式(如果比较长也可以选择缩写),建议每个单词或者拼音的首字母都大写。Bundle原创 2018-01-24 15:32:56 · 315 阅读 · 0 评论 -
iOS UIViewController基类的实现
继承是面向对象编程语言的三大特性之一,写好基类会给App的开发带来极大的方便。在iOS开发中,一般一个页面就对应一个ViewController,ViewController在开发中用的也很多,写一个好的ViewController的基类,会让开发变得轻松很多。 可以写一个BaseViewController,继承自UIViewController,在这里可以实现一些整个项目里ViewContr...原创 2018-04-10 15:42:02 · 3614 阅读 · 0 评论 -
iOS 含tableView的ViewController基类的实现
上篇博客写了ViewController的基类的实现,这篇博客主要写在BaseViewController的基础上实现一个含tableView控件的基类的实现,主要给包含tableView的页面来继承。 BaseTableViewViewController.h代码:#import "BZBaseViewController.h"#import "BZBaseTableViewCell.h...原创 2018-04-10 16:20:38 · 1907 阅读 · 0 评论 -
iOS中用strong和weak来修饰成员变量的对比
对于纯代码布局,用@property声明成员变量时,我是很自然的用strong来修饰的。然后突然有人问我用weak来修饰可不可以,我第一反应是不可以,因为用weak来修饰,初始化过后就会被释放掉,就算我第一句写了初始化的方法,立即执行addSubView也是没办法将其添加上去的。xcode也给出了很明确的警告:Assigning retained object to weak variable; ...原创 2018-06-12 17:14:45 · 3862 阅读 · 0 评论 -
iOS中定义@property时常用的修饰词介绍
iOS编程中,定义成员变量常用格式如下:@property (nonatomic, strong) UILabel *label; 常用的修饰词有atomic,nonatomic,copy,assign,strong,weak,readonly,readwrite等。面试中也会常常被问到这些修饰词的含义及其之间的区别,其本质就是iOS的内存管理,下面会详细介绍每个词的特性和它们的区别,...原创 2018-06-13 16:19:59 · 1047 阅读 · 0 评论 -
【iOS】浅拷贝和深拷贝
浅拷贝和深拷贝浅拷贝即指针拷贝,可以认为是给一只狗加了一条绳子;深拷贝不但拷贝了对象的指针,还在系统中在分配了一块内存用来存放拷贝对象的内容,可以认为是产生了一条带绳子的新狗。即浅拷贝是两根绳子一条狗,深拷贝是两根绳子两条狗且每只狗对应各自的绳子。图示: 深浅拷贝取决于拷贝后的对象是不是和被拷贝对象的地址相同,如果不同,则产生了新的对象,即为深拷贝。如果不同,则只是指针拷贝,相当于re...原创 2018-06-14 11:23:13 · 293 阅读 · 0 评论 -
UIViewController的生命周期
-(void)loadView;loadView方法在UIVIewController的view被访问且为空的时候调用。loadView方法不应该直接被调用,而是由系统调用。它会加载或创建一个View并把它赋值给UIViewController的view属性。以下代码会导致死循环:-(void)loadView{ NSLog(@"ViewController loadV...原创 2018-06-15 10:58:30 · 563 阅读 · 0 评论 -
iOS几种动画效果的实现
做过一个项目,里面涉及到的动画效果比较多,在这里做个小小的总结。直线动画效果实现一个物体在某段时间从一个点移动到另一个点。 效果如下: 动画相关代码如下: 动画模型:@interface AnimationModel : NSObject@property(nonatomic,strong) NSArray * images;@property(nonatomic,as...原创 2018-06-19 17:18:40 · 21887 阅读 · 1 评论 -
iOS自定义表情的实现
现在很多App都有自己的自定义的表情,客户端可能要实现自己定表情的选择、发送和显示,这里我介绍一种简单的自定义表情的实现思路和代码。 以下介绍基本可以实现聊天中对自定义表情的需求,可结合下图来理解: 资源准备:自定义表情图片的命名。每个自定义表情的意思。emtionMeans.plist:key–表情选择器每个表情对应的tag值,value–每个表情的意思。emtions.pl...原创 2018-06-20 16:32:27 · 4620 阅读 · 0 评论 -
iOS阿里云对象存储 OSS文件的上传/下载的实现
之前的项目中,图片语音等资源文件都是直接上传数据流给服务器,然后服务器进行处理和存储。最近的这个项目,服务器直接开的OSS,然后客户端直接使用阿里云提供的上传下载功能来上传和下载资源。 阿里云对图片的处理做的很到位,尺寸在获取图片时可自定义。 首先在项目中导入阿里云OSS的库,直接在pod中加上如下代码:pod 'AliyunOSSiOS'如果不是用pod的话,可点击此链接前往下载:h...原创 2018-06-21 13:48:22 · 12767 阅读 · 2 评论 -
iOS开发iPhone竖屏icon尺寸与启动页尺寸汇总
我比较喜欢在TARGETS的General中设置icon和启动页,也就是如下图的地方: 可能很多人喜欢用LaunchScreen.xib来设置启动页,但是只设置一个的话,可能图片的大小很难适配所有的尺寸。我比较喜欢用Assets来设置,每个系统给对应的尺寸。 下面是我汇总的尺寸,按照所给的尺寸来切图,icon和启动页可以正常显示。icon尺寸: 40x40 60x60 58x5...原创 2018-07-03 17:03:57 · 1964 阅读 · 0 评论 -
iOS常用方法——NSDate常见处理的方法封装
NSDate转换为时间戳+(NSString *)dateChangeToTimestamp:(NSDate *)date{ NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]]; return timeSp;}时间戳转换为NSDate...原创 2018-06-21 16:13:48 · 601 阅读 · 0 评论