UI
中意_中意
这个作者很懒,什么都没留下…
展开
-
经验之谈—如何让图片长的好看(contentMode)
我们在开发中,经常要在view,tableView,等显示图片,比如我们发微博(带有图片的),那么我们常常要考虑如何处理这些图片,是否拉伸,拉伸到什么样的效果等等,常常是需要考虑的问题其实主要的还是要理解UIImageView的ContentMode的这些参数,这些参数一般就能满分我们的开发需求 UIViewContentModeScaleToFill, UIViewContentMod原创 2015-12-22 19:02:16 · 3632 阅读 · 0 评论 -
经验之谈—自定义tabbar(继承于UITabBar)
自定义tabbar一般来说有两种方式,一种是继承于系统的UITabBar,一种是继承与UIView的tabbar。我们现在来看一下继承与UITabBar这种情况中需要注意的一些细节。其实继承与UITabBar我们无非是想修改一下tabbar中的子控件的frame或者是添加子控件等。我们接下来添加一个按钮到自定义的tabbar上。注意的地方:我们先打印一下看看UITabBar里面存在的子控件:原创 2015-12-16 23:58:00 · 1915 阅读 · 0 评论 -
经验之谈—父子控制器(验证苹果的一句话)
苹果官方有一句话说的非常好:当控制器的view互为父子关系,那么控制器最好也互为父子关系我之前有一篇博客说控制器view的显示里边我说了一个很严重的问题,就是当控制的view还在,但是控制器不在了,造成了数据无法显示的问题,所以我们就要想办法保住控制器的命。那么我们今天继续来看一下,如何保住控制器的命。今天我们来用屏幕旋转的一个案例来说明一个问题:当控制器的view互为父子关系的时候,控制器不是父原创 2015-12-16 09:29:58 · 2556 阅读 · 2 评论 -
经验之谈—如何避免第三方框架过分的污染我们的项目
其实一直在纠结。若第三方框架在我们项目中多处地方被使用到,而这个框架又经常更新,若出现更新说:此次更新,修改了之前的什么大bug。若更新之后,造成了我们的项目,无法运行,那么我们要修改的地方就非常多,因为前期对这个框架过分的依赖。怎么办?一个个去找,去修改,那代价是惨重的。那么如何避免这种情况呢,让这些经常更新,经常变动的框架对我们的项目的影响将到最低呢,我们想,若这个框架只影响到我们项目的一处地原创 2015-12-16 12:09:14 · 1560 阅读 · 0 评论 -
经验之谈—没有尺寸的父控件
在开发中,我们也会经常碰到一个控件的各种奇葩的事情,常常会导致我们有一些误解或者出不来我们想要的结果。比如没有尺寸的父控件,那么这个子控件会怎样?千万不要因为父控件没有尺寸,子控件就不会显示出来,那是非常错误的一个想法。我们看一下一下代码: - (void)viewDidLoad{ [super viewDidLoad]; UIButton *red = [[UIButton原创 2015-12-14 14:11:29 · 1425 阅读 · 0 评论 -
经验之谈—坐标系的转换
项目中,经常使用到坐标的转换,因为有些控件在布局的时候,可能参考点不一致,所以造成的frame不是我们想要的。我们举个例子来说明一下:- (void)viewDidLoad{ [super viewDidLoad]; // 蓝色 UIView *blue = [[UIView alloc] init]; blue.backgroundColor = [UIColo原创 2015-12-14 00:31:44 · 2707 阅读 · 0 评论 -
经验之谈—PCH 中使用:const 与宏
很多时候,由于开发的需要,我们常常需要在pch中定义一些在整个项目中都用得到的变量等一般来说,在以前的开发过程中,我们都习惯于直接在pch中写一个宏就搞定了。但是我们仔细的分析苹果官方文档,会发现,他里面定义的一些变量,不是用宏定义的,而是用const那我们就要知道为什么用const了,首先了解一下const的一些基本的使用,在C语言的语法中,若我们若const休息一些变量会出现什么情况,简单了原创 2015-12-13 23:58:08 · 2076 阅读 · 0 评论 -
经验之谈—控制器的view的显示
开发中,我们经常需要将一个控制器的view添加到另一个控制器的view上,这种效果是我们期望看到的,但是里边隐藏着一些细节,不注意的话,可能会达不到我们想到的效果。先举个例子给大家看一下: 我们创建一个ZYTestViewController : UITableViewController 然后我们稍微实现以下tableview的数据源方法#pragma mark - Table view原创 2015-12-14 09:00:25 · 4265 阅读 · 1 评论 -
经验之谈—KVC(forKey,forKeyPath)
KVC是Cocoa一个大招,非常牛逼。利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 如:Person.m文件中:@implementation Person{ @private double _height;}- (void)printHeight{ NSLog(@"height是%f", _height);}@endPerson原创 2015-12-14 00:57:03 · 4349 阅读 · 0 评论 -
最方便,好用的单例—实现一行代码创建单例
一般来说,我们在一个类中写单例,要是想考虑的全面,那么要考虑到各个因素。因为我们不知道别人创建单例的时候,通过什么创建的。所以我们就必须把通过各个方式创建的单例,都写出来:+(instancetype)sharedSoundTool{ static id instance = nil; static dispatch_once_t onceToken; dispatch_原创 2015-11-29 21:47:12 · 3076 阅读 · 2 评论 -
AFN(上传、下载)
下载操作(使用KV0监听进度) - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 获得网络管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 要下载文件的url NSU原创 2015-12-02 17:14:12 · 4607 阅读 · 1 评论 -
经验之谈—实现图片下拉放大的效果
这里我们主要是用一下,如何能保持原来的图片的宽高比来轻松的实现放大的效果,主要的是UIViewContentModeScaleAspectFill这个起的效果:我们用tableView来展示这个效果吧我们这里并没有计算图片的宽高比,直接用UIViewContentModeScaleAspectFill来实现#import "ViewController.h"const CGFloat ZYTop原创 2015-12-22 19:15:12 · 11971 阅读 · 0 评论 -
经验之谈—UIButton传值通过枚举
其实在我们开发中,经常会遇到有些朋友写的代码里面,由很多的数字,如果你突然看到了一堆的1,2,3,4,5,或者switch判断里面,case 1: cae 2: case 3 等等,这些代码往往给人很蒙的感觉。无从下手,其实这就是我们所说的可读性很差的代码。其实说起可读性的话,那么我们现在也顺便说一下注释的问题(题外话),其实我们发现,很多大公司,写的注释反而很少,为什么,因为他们的代码就是原创 2015-12-22 12:27:49 · 2609 阅读 · 0 评论 -
经验之谈—正则表达式实现图文混排
在项目中,我们经常需要发表情,以及经常需要将表情字符转换成表情。因为表情是一个图片,所以我们发给服务器的时候,实际上是发一段特殊的文字给服务器,然后转换成表情。以免浪费用户过多的流量。那接下来,我们就来介绍一下,如何使用正则表达式实现图文混排呢?为了以后的代码的管理方便,我们抽取出两个类:NSString+Regular.h中,我们暴露两个方法出来:/** * 返回正则表达式匹配的第一个结原创 2016-01-06 23:08:50 · 2713 阅读 · 0 评论 -
经验之谈—项目如何分模块(MVC)
一般来说,无非就两种情况: 我们假如一个项目是长这样子的: 随便找一个来说,比如找美团的:按MVC来分模块根目录Controller团购上门商家我的更多Model团购上门商家我的更多View 团购上门商家我的更多按模块来分MVC团购 ControllerModelView上门ControllerModelView商家ControllerModel原创 2015-12-22 09:01:19 · 5764 阅读 · 0 评论 -
NSURLSession下载文件—断点续传
首先我们懒加载一下:NSURLSession会话配置对象大多情况使用默认的配置就可以了NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];NSOperationQueue:没有串行的概念delegateQueue:传入nil和[[NSOperationQueu原创 2015-12-02 21:21:45 · 2986 阅读 · 3 评论 -
检测网络状态
这里使用第三方框架来实现:Reachability 非常简单,但是也是非常实用的懒加载一下- (Reachability *)reachabilityManager { if (_reachabilityManager == nil) { // 根据主机来创建的Reachability _reachabilityManager = [Reachabili原创 2015-12-02 21:50:21 · 1678 阅读 · 0 评论 -
经验之谈—OAuth授权流程图
其实我们在开发中,经常需要解决获得用户的一些特定的数据,比如:可以选择使用微博登陆,使用QQ登陆等等,然后我们间接的获得用户的头像,昵称等信息。这些都涉及到OAuth授权的内容OAuth授权有这么几个特点: OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准OAuth 的授权不会使第三方触及到用户的帐号信息OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在原创 2015-12-19 09:46:18 · 2310 阅读 · 0 评论 -
AFN的一些常见的用法(GET,POST)解析(XML,Json)
GET请求使用AFN有以下几点注意点 没有URL的概念已经序列号成字典没有线程间通信的概念,不用考虑线程间通信GET请求参数可以不需要拼接到URL后面通过GET请求获得服务器返回的json数据 - (void)getJson{ //获得网络请求管理者 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOpera原创 2015-12-02 16:01:58 · 7024 阅读 · 1 评论 -
经验之谈—initWithFrame;initWithCoder;awakeFromNib
首先说一下,这几个方法在我们自定义控件的时候,会经常调用。但是具体的是什么时候应该调用什么方法,现在我来总结一下这几个方法分别在什么时候调用:initWithFrame一般的写法: - (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { //代码 }原创 2015-12-13 09:35:32 · 5376 阅读 · 0 评论 -
多线程 ——pthread
参数第一个参数:为指向线程标识符的指针。线程的idC语言中没有对象的概念,要实现对象,实用的是结构体,不需要加 *第二个参数:用来设置线程属性。第三个参数:是线程运行函数的起始地址。在c语言中 void * (指向任何地址的指针)等于 OC的id(万能指针)void * (函数指针)(void ) 格式:返回值 函数指针(参数)函数的名字就是函数在内存的中起始地址类似数组名就是指向数原创 2015-11-20 21:58:12 · 868 阅读 · 0 评论 -
modal
//就相当于show方式的pop [self dismissViewControllerAnimated:YES completion:^{ }];- (IBAction)openClick{ UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; myModalViewCon原创 2015-11-20 21:49:50 · 590 阅读 · 0 评论 -
PCH文件的使用
在x-code6之后,系统默认不会自动导入pch文件,我们需要手动配置pch文件 进行配置修改Prefix Header的内容为: 1. “(SRCROOT)/(SRCROOT)/(PRODUCT_NAME)/文件名.pch” (如果有问题,换下面的方式,可能会与中文有关) 2. “$(SRCROOT)/对应的文件夹名(应用程序名称)/文件名.pc原创 2015-11-09 22:13:46 · 801 阅读 · 0 评论 -
程序启动的完整过程
main函数UIApplicationMain创建UIApplication对象创建UIApplication的delegate对象delegate对象开始处理(监听)系统事件(没有storyboard)程序启动完毕的时候, 就会调用代理的 application:didFinishLaunchingWithOptions:方法在application:didFinishLaunchi原创 2015-11-09 22:39:29 · 702 阅读 · 0 评论 -
UIPickerView
UIPickerView1.UIPickerView的常见属性 // 数据源(用来告诉UIPickerView有多少列多少行)@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;// 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择)@property(nonatom原创 2015-11-09 22:55:17 · 536 阅读 · 0 评论 -
loadView
第一次加载view的时候,会调用loadView这个方法。也就意味着第一次访问view的时候,view还为nil,它会调用loadView这个方法创建view(必须调用父类的loadView),也就说明他是一个懒加载的方式不是说控制器创建好,控制器的view就创建好,而是当我们用到这个view的时候才会创建无论控制器的view是以何种方式创建的,他一定是调用loadView的方式创建的调用流程图原创 2015-11-09 21:51:56 · 942 阅读 · 0 评论 -
plish文件的读取(NSBundle)
plish文件一般放置于NSBundle当前路径是开发者电脑的文件 全路径,而以后应用程序编译生成发布之后,是在iPhone上运行,也就意味着它应该去查找iPhone上德plist文件的全路径 NSBundle *bundle = [NSBundle mainBundle];接下来就是将根目录与文件名进行拼接 NSString *path = [bundle pathForResource:原创 2015-10-08 00:02:46 · 1494 阅读 · 0 评论 -
图片浏览器
首先:storyboard里面有这么些个控件:可以拖控件,也可以代码实现 然后我们准备了一个plist文件我们在ViewController.m中写了如下的代码#import "ViewController.h"@interface ViewController ()- (IBAction)left;- (IBAction)right;//页码@property (weak, nonato原创 2015-10-08 00:14:09 · 660 阅读 · 0 评论 -
退出键盘 IBAction,IBOutlet
退出键盘 - (IBAction)calculate { //1.获取两个文本框的数据 int num1=[self.txt1.text intValue]; int num2=[self.txt2.text intValue]; //2.计算 int result=num1+num2; //3.显示结果 self.resultLbl.text原创 2015-10-06 23:45:50 · 615 阅读 · 0 评论 -
frame | center |bounds |transform
frame修改控件的位置以及大小不能直接修改一个对象的结构体成员的属性值,但是你能直接修改一个结构体成员的属性值错误的写法self.iconView.frame.origin.y-=10应该这样写:CGRect temp=self.iconView.frame;temp.origin.y-=10;self.iconView.frame=temp;多控件共用一个事件方法–Tag值的使用-原创 2015-10-06 23:28:53 · 714 阅读 · 0 评论 -
实现应用管理 (MVC ,xib,懒加载)
Model类进行了数据的封装 .m文件里面#import "ZYApp.h"@implementation ZYApp//封装数据 + (NSArray *)apps{ return [NSArray arrayWithContentsOfFile: [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];}@原创 2015-10-11 00:04:11 · 1081 阅读 · 0 评论 -
监听文本输入框内容值的改变——4种方法
addTarget#import "ViewController.h"@interface ViewController ()@property (weak, nonatomic) IBOutlet UITextField *nameView;@property (weak, nonatomic) IBOutlet UITextField *pwdView;@property (weak, n原创 2015-10-18 23:47:54 · 7378 阅读 · 0 评论 -
Runtime
有时候,某个控件的系统提供的属性,无法满足我们的需求,那么我们就急迫的去添加某个我们所需要的属性继承:继承的话,可以实现,但是有时候不太满足的我们所需 继承要改相应控件的class属性,若我们写出来的框架,想拿来就能直接使用,那么这个时候继承显得不是那么的合适这个时候,我们想到了分类,但是默认分类里边,不能添加属性,如果要添加,则要重新设置setter,getter方法这个时候runtime原创 2015-11-23 18:54:08 · 742 阅读 · 0 评论 -
分类在控件中的特殊使用—添加必要的“属性”
之前我们使用runtime为控件添加了属性,现在我们不用runtime 看如何实现为某个控件添加“属性”其实这不是真正的添加属性我们也是给UIView添加坐标 .h文件#import <UIKit/UIKit.h>@interface UIView (ZYExp)@property (nonatomic, assign) CGFloat x;@property (nonatomic, as原创 2015-11-23 19:04:55 · 541 阅读 · 0 评论 -
UIAlertController
看一下如何实现下面的效果 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"操作提示" message:@"真的要注销吗?" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *tem1 = [UIAlertActi原创 2015-11-01 23:47:43 · 754 阅读 · 0 评论 -
数据存储(沙盒,偏好,归档)
由于需求的关系,今天来讲讲数据的存储沙盒拼接与方法- (IBAction)write { NSArray *data=@[@"张三",@"李四",@"王五",@"赵六"]; //0.确定需要 写入的数据 NSString *sandBox=NSHomeDirectory(); NSString *docPath=[sandBox stringByAppending原创 2015-11-01 23:37:48 · 1647 阅读 · 0 评论 -
控制器之间的传值—— segue与代理的合作
现在我们要实现两个窗体之间的传值segue这个在顺传的时候的起的作用,我们用两个窗体举例子来说明segue的概念和作用: segue就是指进行跳转的那根连线segue的三个常用属性: identifier:当前segue的标识destinationViewController:segue的目标控制器sourceViewController: segue的源控制器- (void)prep原创 2015-11-01 22:57:30 · 960 阅读 · 0 评论 -
UIDatePicker
常见属性 // datePicker的显示模式@property (nonatomic) UIDatePickerMode datePickerMode;// 显示的区域语言@property (nonatomic, retain) NSLocale *locale;2.监听UIDatePicker的选择 * 因为UIDatePicker继承自UIControl,所以通过addTarget原创 2015-11-09 22:57:31 · 679 阅读 · 0 评论 -
用UIApplication来管理状态栏
从iOS7开始,系统提供了2种管理状态栏的方式通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)通过UIApplication管理(一个应用程序的状态栏都由它统一管理)在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式状态栏的样式原创 2015-11-09 22:30:17 · 863 阅读 · 0 评论 -
UIScrollView
UIScrollView的用法很简单 将需要展示的内容添加到UIScrollView中设置UIScrollView的contentSize属性,告诉UIScrollView所有内容的尺 寸,也就是告诉它滚动的范围(能滚多远,滚到哪里是尽头)如果UIScrollView无法滚动,可能是以下原因: 没有设置contentSizescrollEnabled = NO没有接收到触摸事件:user原创 2015-10-18 23:44:04 · 400 阅读 · 0 评论