iOS开发(OC语言)
文章平均质量分 71
我们都曾拥有最美的时光
https://github.com/Soulghost
展开
-
(一)UI设计的一些常识
一、概述新版本的Xcode似乎框架不明示。UIView:屏幕上看得见摸得着的东西。视图、控件、组件。UIView是一个容器,能容纳其他UIView。UIViewController用来控制UIView。按钮事件的绑定:1.右键单击,选择touch upinside。2.要绑定的方法返回值设置为IBAction。3.二者进行连线。原创 2015-02-04 20:57:47 · 1292 阅读 · 0 评论 -
(二)plist的使用和序列帧动画
六.plist的使用方法:iOS的程序在安装在手机上以后会把全部资源文件集成在一个文件夹中,这种文件集合称为bundle,对于一般的工程,只有一个bundle,即mainbundle,因此可以通过bundle来获取文件的全路径,然后读取文件,下面的例子读取的是一个数组plist。NSArray *dictArray = [NSArrayarrayWithContentsOfFi原创 2015-02-04 21:03:56 · 2205 阅读 · 0 评论 -
(三)懒加载以及一些设计规范
八.文档注释/** 这是一只显示图片的猫 */@property (weak, nonatomic) IBOutlet UIImageView *tom;这样的好处是调用时显示注释:九.UIButton UIImageView区别1.需要监听图片点击,需要用UIButton。2.相同点:能显示图片。 不同点原创 2015-02-04 21:07:36 · 857 阅读 · 0 评论 -
(七)大图展示Demo引出的UIScrollView的使用
UIScrollView是一个能够滚动的视图控件,可以通过滚动查看所有内容。用途:1.一张大图屏幕放不下,可以用各个方向的手势来看大图的各个部分。2.手机的设置页面有很多的选项,需要上下滚动来查看。使用步骤:1.将需要展示的内容添加到UIScrollView中2.设置UIScrollView的contentSize属性,表示所有内容的尺寸(滚动的范围)。只能通过原创 2015-02-05 09:35:49 · 647 阅读 · 0 评论 -
(四)封装和优化的一些规范
十一.字典转模型用字典存放数据的坏处:字典的key有可能写错。因此常用模型来存储数据。创建一个模型类。注意字符串的@property用copy代替strong(copy用到NSString)。weak一般用于UI控件,assign用于基本数据类型。这样只需要检查字典转换为模型时的key是否正确。控制器直接访问模型内部的属性原创 2015-02-04 21:11:28 · 507 阅读 · 0 评论 -
(六)应用图标和启动图片
十六.设定启动图片和应用图标1.应用图标应用图标需要多种规格的原因:1.iPhone上显示的图标2.AppStore上显示的图标3.Spotlight上显示的图标(搜索栏搜到的图标)注意图标命名为Icon-xx.png因此需要提供不同的样式。同名@x2和同名@x3表示更大尺寸的自动适配图片。填充图标的方法:首先按照标准原创 2015-02-04 22:03:44 · 699 阅读 · 0 评论 -
(五)超级猜图Demo引出的细节
第一部分:1.按钮的细节,设置背景和前景图片后,要使得背景显示出来,可以设置内边距,影响内部内容。显示 图片+文字,用button更简单。问题是,如果不想按钮被点击,在属性面板取消勾选User Interaction Enabled. 2.状态栏的颜色控制(背景色深色,将状态栏调整为白色):/** * 控制状态栏的样式 * *原创 2015-02-04 22:01:35 · 618 阅读 · 0 评论 -
(八)喜马拉雅Demo引出的细节(代理模式和图片缩放)
喜玛拉雅是一款电台APP,界面非常美观,通过模仿这一APP学习到很多细节。1.图片导入后有些框内不全如何补全:寻常的办法是再准备一张图片拖入,比较好的办法是右击已经导入的图片选择Show in Finder,通过编辑Contents.json文件来修改。2.如何确定UIScrollView的总体尺寸:根据尽头的控件尺寸和位置。使用方法CGRectGetMaxY,传入尽头控件的f原创 2015-02-05 12:11:26 · 796 阅读 · 0 评论 -
(十三)UITableView数据模型化
多组数据的TableView的设计方法:每一组用一个模型对象表示。模型包含了标题数据和行数据的数组,在控制器里包含模型的组来对各个模型进行初始化。在tableView相应的方法中,从控制器的模型组中取出模型来处理。需要补充一点cell的获取,使用方法:UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UIT原创 2015-02-06 10:17:07 · 730 阅读 · 0 评论 -
(十四)单组数据展示(字典转模型、模型初始化细节)
类似游戏助手,展示游戏资料。可以通过程序进行网页抓取,从而生成要展示的plist。Tip:在实现tableView的方法时,先写返回值再敲tableView可以过滤掉大部分方法,从而快速找到要实现的。要在Cell中显示标题、内容、图片,应该设置样式为UITableViewCellStyleSubtitle。UITableViewCell *cell = [[UITableViewC原创 2015-02-06 11:13:34 · 822 阅读 · 0 评论 -
(十八)TableView实践(多组汽车品牌展示)
对于多组数据,可能会用到模型的嵌套。例如多组汽车,每组是一个模型,组内有多辆车的信息,每辆车的信息也是一个模型,相当于模型中有模型。可以看到,每个item是一个字典,这要创建一个模型,而模型内部的cars数组中每一个元素又是一个字典,即还需要一个模型。Tip:命名的时候,关于描述的不要写description,否则会把系统的这个方法覆盖,一般是写desc。取出一个模型数组中原创 2015-02-06 16:07:51 · 862 阅读 · 0 评论 -
(十二)UITableView的基本使用
UITableView之所以支持滚动,是因为继承自UIScrollView。默认是垂直滚动,性能极佳。UITableView的两种样式:1.UITableViewStylePlain 例如通讯录的视图。2.UITableViewStyleGrouped 分组样式,例如微信的发现视图。如何在TableView上显示数据:需要通过一个数据源(dataSource)来展示原创 2015-02-05 21:11:42 · 562 阅读 · 0 评论 -
(十七)TableView的本地性能优化
面试中常常会问TableView的性能优化。TableView只会加载能看到的Cell,每当有一个Cell进入视野范围内,就会调用。存在着内存隐患,如果用户拖动的很快,所以内存会飙升的很快,因此要针对cell的返回方法上进行性能优化。优化方案:系统调用这个方法的时候就是为了得到cell,一般的方法就是每次都alloc一个cell,可以设计一个缓存池,当被创建过的cell逃出视野后,将这原创 2015-02-06 15:25:56 · 553 阅读 · 0 评论 -
(十)弹出框Alert与ActionSheet
第一种方式:中间弹窗从中间弹出的窗口称为AlertView。可以设置多个按钮,取消按钮会放在对右端或者最下端,按钮超过两个,会竖着排列。UIAlertView *alert = [[[UIAlertView alloc] init] initWithTitle:@"标题" message:@"消息" delegate:self cancelButtonTitle:@"取消" other原创 2015-02-05 16:25:05 · 1001 阅读 · 0 评论 -
(十五)UITableViewCell的常见属性
UItableViewCellStyle:typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, //左边imageView,右边显示textLabel UITableViewCellStyleValue1, // 左边显示imageView,右边显示textLabel与d原创 2015-02-06 12:00:21 · 708 阅读 · 0 评论 -
(十六)TableView常见属性
千万不要忘记设置TableView的数据源。1.分割线的样式:separatorStyle与separatorColor。颜色:十六进制表示32bit:argb各占8位。 #aarrggbb24bit:rgb各占8位。 #rrggbba为透明度。注意:rgb全00为黑色,全ff为白色。注意要/255.0来表示,从0-1.0进行表示。self.tableVie原创 2015-02-06 12:41:36 · 561 阅读 · 0 评论 -
(十一)延时执行、圆角(可实现圆形label)、代理设计模式
延时执行:使用控件的performSelector...方法,例如用于移除,可以写在一行。[lab performSelector:@selector(removeFromSuperview) withObject:lab afterDelay:4.0];圆角的实现:在iOS6中,只需要设定label.layer.cornerRadius即可实现圆角。但是iOS7+中,需要将l原创 2015-02-05 16:36:46 · 1162 阅读 · 0 评论 -
(二十五)键盘的设置与TextField细节处理
设置Return Key类型为Send并且勾选下面的复选框即可实现没有内容时禁用keyboard,有内容自动启用。文本框左边框与文本留有间距的方法://文本框左侧留下间距 UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)]; self.textInput.leftView原创 2015-02-07 13:45:48 · 612 阅读 · 0 评论 -
(二十三)通知机制及其应用
键盘出现后,应该让工具条上升键盘的高度。注意:键盘的监听是不设置代理的,而是通过通知机制(用于多对象通信)。通知中心(NSNotificationCenter)用于对象之间的通信,类似于代理(可以在两个对象之间互相传递消息),而通知可以一对多。通知和代理的区别:后者是一对一,前者可以多对多(发布者也是接收者,可以有多个发布者)。每个App都有唯一的通知中心实例,专门负责协助不同对象原创 2015-02-07 11:12:19 · 573 阅读 · 0 评论 -
(二十)即时通信的聊天气泡的实现I
Tip:通过xib和storyboard不可能将一个控件作为ImageView的子控件,只能通过代码的addSubview方法实现。设置图片的细节:如果button比图片大(为了方便对齐),将图片设置为image而不是background,图片不会被拉伸到失真。为了保证在不同系统上显示的效果一样,可以不使用系统默认样式,用自定义的背景等,例如QQ的聊天框,如果要实现,首先将TextFiel原创 2015-02-06 19:38:33 · 2465 阅读 · 0 评论 -
(二十二)常用方法(工具方法)的抽取
前面实用的根据文字计算尺寸和拉伸图片的方法是很常用的,应该抽取为工具方法,搞一个工具类。OC里面一般是用分类(Category)来实现这个功能。分类一般是给系统自带的类扩充一些方法。拉伸图片的方法应该封装在UIImage类内。将图片拉伸方法写到分类当中去:尽量声明为类方法,这样方便实用。#import "UIImage+Resize.h"@implementation UI原创 2015-02-07 10:55:20 · 557 阅读 · 0 评论 -
(二十八)QQ好友列表的展开收缩
要通过监听HeaderView上面的Button来进行操作:通过addTarget方法即可,应该将按钮的点击方法封装在HearView控制器内部。列表收起来的原理:tableView: numberOfRowsInSection: 方法返回0就是不显示,注意要刷新表格。只要在Group模型中定义一个变量表示是否展开:/** * 是否需要展开 */@property (n原创 2015-02-08 21:51:30 · 881 阅读 · 0 评论 -
(二十一)即时通信的聊天气泡的实现II
一些优化:禁止TableView的点击:self.tableView.allowsSelection = NO;合并相同的时间:不需要显示的时间,只要不设置尺寸就行了。一个if判断的技巧,为了防止把==写成赋值,可以让左边的为非左值:NO == message.hideTime对于时间的判断,应该放在所有模型加载的地方(懒加载的位置)。为了得到上一条消息,由原创 2015-02-07 08:59:04 · 959 阅读 · 0 评论 -
(二十四)监听键盘的通知和键盘弹出隐藏的View移动
让控制器监听键盘的通知,注意谁监听,谁的dealloc方法中就要remove,如果非ARC还要调用父类的dealloc方法。//监听键盘的操作: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWill原创 2015-02-07 13:03:31 · 844 阅读 · 0 评论 -
(二十六)静态单元格(Cell)
制作类似iOS系统设置的页面,如果使用代码来实现,将会比较麻烦,可以通过静态单元格技术方便的实现。注意:静态单元格只支持TableViewController。可以通过storyboard直接操作单元格。步骤:1.设置TableView样式为Static Cells:2.选中一个Cell,修改Style即可实现内部默认的系统布局:3.修改Section可以修原创 2015-02-07 15:01:34 · 774 阅读 · 0 评论 -
(二十九)动态单元格 - 循环利用注意全面覆盖信息
动态单元格可以绑定一个Cell控制器,优点是可以任意定义Cell的样式,然后在控制器里设置Cell的内容,例如布置为下图的样式:从storyboard绑定标识的方法:设置Identifier后,即可通过出队方法获取这个Cell。获取这个Cell的方法:这样是自动进行缓存池优化的,缓存池中没有,直接从storyboard中的模板创建。AppCell *cell = [ta原创 2015-02-09 09:49:19 · 566 阅读 · 0 评论 -
(十九)TableView的点击监听和数据刷新(Alert的多种样式) -tag传值的技巧
要实现监听,要使用代理,控制器要成为TableView的代理。注意下面的方式是代理方法:- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"选中了第%d组的第%d行",indexPath.section,indexPath.row);原创 2015-02-06 17:41:48 · 1108 阅读 · 0 评论 -
(五十五)iOS多线程之GCD
GCD的全称为Grand Central Dispatch,翻译为大中央调度,是Apple开发的一个多线程编程解决方法。进程和线程的概念:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间。线程是进程中一个独立的执行路径,即主线程,主线程有1M的栈区,对于耗时的执行路径,可以放在子线程(512K栈区)中执行。Tip:新建线程会消耗内存空原创 2015-02-16 18:41:26 · 778 阅读 · 0 评论 -
(五十二)触摸事件初步
iOS中的事件分为三类:1.触摸事件2.加速计事件(摇晃等)3.远程控制事件(例如线控)响应者对象:在iOS中不是任何对象都能处理事件,只有继承自UIResponder的对象才能接受和处理消息,称之为“响应者对象”。UIApplication、UIViewController、UIView都继承字UIResponder,因此都可以处理事件。UIResponder原创 2015-02-15 19:20:27 · 540 阅读 · 0 评论 -
(五十八)NSObject实现多线程、自动释放池的补充
模拟一个图片下载的场景,图片的下载需要2s,在这期间为了保证程序的流畅,应该把图片的下载放在子线程中进行。使用NSObject的方法performSelectorInBackground方法即可实现:[self performSelectorInBackground:@selector(setImagePath:) withObject:@"Icon"]Tip:imageView的si原创 2015-02-20 16:21:28 · 923 阅读 · 0 评论 -
(三十三)Xcode项目的重要工程文件
1.Supporting files内有一个Xxx-Info.plist文件(旧版本Xcode的配置文件叫Info.plist)。因此自定义的plist不要带Info关键词。这个plist是系统的全局配置,不能删除。Bundle display name是软件的名称,需要注意的是修改完软件名称要先Clean工程,然后卸载原来的App再运行。InfoDictionary versio原创 2015-02-09 16:24:11 · 562 阅读 · 0 评论 -
(三十一)PickerView自定义视图
例如选择国家,左边是名称右边是国家,不应该使用两列,而是自定义PickerView的一列,可以通过xib来实现。注意,虽然PickerView也是一列,但是数据源方法是@required,所以必须实现。因此,核心思想就是一列,自定义PickerView的行视图。使用viewForRow方法可以设定行视图。这样的视图可以通过xib和它的控制器进行封装:Xi原创 2015-02-09 14:44:36 · 1495 阅读 · 0 评论 -
(三十四)NavigationController初步
为了了解底层,首先不基于UIWindow而基于UIWindow来创建App。由于Xcode6没有以前的基于UIWindow的空项目,所以选择SingleView,然后删除storyboard,移除BuildSettings里面的main Interface。然后在AppDelegate中初始化一个窗口交给成员变量。- (BOOL)application:(UIApplication *原创 2015-02-10 12:15:57 · 598 阅读 · 0 评论 -
(五十九)iOS网络基础之UIWebView简易浏览器实现
【UIWebView网络浏览器】通过webView的loadRequest方法可以发送请求显示相应的网站,例如: NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"]; // 创建请求数据 NSURLRequest *request = [NSURLRequest requestWithURL:url];原创 2015-02-20 17:52:44 · 1095 阅读 · 0 评论 -
(五十六)iOS多线程之NSOperation
NSOpertation是一套OC的API,是对GCD进行的Cocoa抽象。NSOperation有两种不同类型的队列,主队列和自定义队列。主队列运行于主线程上,自定义队列在后台运行。原创 2015-02-17 10:37:00 · 666 阅读 · 0 评论 -
(三十三)UIApplicationDelegate和程序的启动过程
移动操作系统有个致命弱点,是app容易受到干扰(来电或者锁屏)。当app受到干扰时,会产生一系列的系统事件,这时UIApplication会通知其delegate对象,让delegate处理系统事件。delegate可以处理生命周期事件、系统事件、内存警告等。ApplicationDelegate已经遵循了UIApplicationDelegate协议,直接在ApplicationDe原创 2015-02-10 10:27:13 · 605 阅读 · 0 评论 -
(五十七)线程的资源共享、单例的实现
【资源共享的问题】例如线程A与B均实现数字Num的加一操作,如果不加以限制,可能A和B先后拿到最初的Num,然后返回Num+1,无法实现Num+1之后再+1。【互斥锁】使用互斥锁(@synchronized)来解决,让线程A操作时锁住Num,不允许B的读写,直到A操作完并且写回后,再让B进行工作,再锁住Num,直到B操作完毕,再解开锁,类似于上厕所,在厕所内要锁门一样。使用@syn原创 2015-02-20 13:40:56 · 832 阅读 · 0 评论 -
(三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时
细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变。因为文本框的文本改变代理不能处理,因此应该使用通知Notification。文本框文本改变会发出通知:通知的前两个参数表示接收者object接收到通知时调用哪个类的哪个函数。[[NSNotificationCenter defaultCenter] addObserver:self selector:@se原创 2015-02-11 11:46:53 · 581 阅读 · 0 评论 -
(三十九)数据的持久化存储-plist实现(XML属性表)
iOS应用数据存储的常用方式:归档:用某种格式保存数据。XML属性列表(plist)归档(持久化)Preference 偏好设置NSKeyedArchiver归档SQLite3 数据库 效率最高缺点是SQLite是关系型数据库,将对象存入数据库需要将对象进行转码(使用SQL语句)Core Data 苹果官方提供的对SQLite数据库操作的封装应用沙盒:每原创 2015-02-11 20:15:31 · 503 阅读 · 0 评论 -
(四十)数据持久化存储的偏好设置实现
偏好设置一般是用于存储软件的常用设置。偏好设置存储的本质是plist,不需要关心文件夹和文件即可存储。偏好设置的存储方式类似于字典存储,使用键值对来保存数据。保存方法: //创建能够直接访问/Library/Preferences的对象 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];原创 2015-02-11 21:20:42 · 498 阅读 · 0 评论