小知识点
iOS 9 中 navgationBar 自动将 self,view 推到底下
也就是 说 self.view.frame.origin.y = 0 的位置 就是 navigationBar.maxY 的位置
iOS,手势和Button共存,button动作被屏蔽怎么办。
tapGestureRecognizer.cancelsTouchesInView = NO;
在手势初始化的时候加上这句就行了。
手势和 button 同时存在,会优先识别手势
// 学习小型控件的 使用
http://ios.9tech.cn/news/2013/0930/29208.html
一、UIActionSheet 行动表
二、UIAlertView 警告
三、UISlider 滑块
四、UIProgressView 进度条
五、UISwitch开关
六、UISegmentedControl 分段控制
tableView 的 cell 这块 view 的宽高是 320 * 44 ;
cell.contentView 这块View 320 * 44
只是初始位置不一样, 两块叠加
从下往上 默认有 8 的底部高度
不让 cell 被选中
[tableView setselectionStyle:UItableViewSelectionStyleNone];
alertView 的textFieldAtIndex 可以取到当行的 textfield
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
alertView.tag = viewTag;
alertView.delegate = self;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIPickView 三级联动
图片轮播器 删除一张,立即按返回按钮 , 控制器不会调用 dealloc 方法
即在控制器有操作的情况下,点击返回是不会触发 dealloc 方法
如果只是
preferredMaxLayoutWidth
支持多行文本分行属性
UITextfield 可以选择是否可以选中
定制 searchBar 的两个属性
_searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
_searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
[self.tabBarController.tabBar hideBadgeOnItemIndex:UserNormalControllerTalk];
<key>LSApplicationQueriesSchemes</key>
<array>
<string>alipay</string>
<string>wechat</string>
<string>weixin</string>
</array>
URL Sceme URL 白名单
设置在深色背景下状态栏白字
设置在浅色背景下状态栏黑色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
JSBadgeView badgeView 的功能
JSBadgeView 可以直接浮现在 parentView 的一个位置上
JSBadgeView *badgeView = [[JSBadgeView alloc] initWithParentView:imageViewLeft alignment:JSBadgeViewAlignmentTopRight];
自定义导航栏背景和标题的颜色
[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:20/255.0 green:155/255.0 blue:213/255.0 alpha:1.0]];
[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];
用 TitleTextAttributes 这个方法;
两个控制器之间的转换
[self transitionFromViewController:_messageList toViewController:_friendsList duration:0.2 options:UIViewAnimationOptionAllowAnimatedContent animations:nil completion:nil];
最简单的添加四边约束
[_webView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
UIControl 中控制水平和居中的方式
@property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment; // how to position content vertically inside control. default is center
@property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment; // how to position content hozontally inside control. default is center
iOS 7 新特性
在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll。当你的容器是navigation controller时,默认的布局将从navigation bar的顶部开始。这就是为什么所有的UI元素都往上漂移了44pt。
self.translatesAutoresizingMaskIntoConstraints = NO;
AutoresizingMask 自动转化为 约束 Constraints 默认为 yes ;
IB 会把他调整为 NO ,为此,需要在 IB 里面勾选 SizeClass
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
constraintMaker 会追踪到当前那一块 View
//系统给的不带参数的回调
@property(nonatomic,strong) dispatch_block_t buttonOneBlock;
通过控制分割线样式来控制 _tableView.separatorInset
UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)
//判断摄像头是否能用
BOOL Custom= [UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
其中只有在程序强制退出或者来电时,取消点击事件才会调用。
touchCancelled: withEvent:(UIEvent *)event
分别有多点触控、摇一摇以及远程操作(在iOS之后新增了3DTouch事件类型)
在view添加单击手势之后,原来的touchesEnded方法就无效了。最开始我一直认为view添加手势之后,原有的touches系列方法全部无 效。但是在测试demo中,发现view添加手势之后,touchesBegan方法是有进行回调的,但是moved跟ended就没有进行回调
[UIFont fontWithName:button.titleLabel.font.fontName size:titleSize]方法会占用极大的内存(已反复试验),每次都需要对Label进行处理。在此处请谨慎使用此方法,此变换效果也是其中一种可根据自行需求进行修改。有更好的方法可告知。
所以在UI 字体, button 等部分 能用 system 就用 system 节省内存
__WEAK_SELF_YLSLIDE
// slideTitleView 栏目button 点击的监听
// 滚动到指定的栏目下
_slideTitleView.slideTitleViewClickButtonBlock = ^(NSUInteger index){
if (weakSelf) {
__STRONG_SELF_YLSLIDE
CGRect frame = strongSelf.mainScrollview.bounds;
frame.origin.x = CGRectGetWidth(strongSelf.frame) * index;
[strongSelf.mainScrollview scrollRectToVisible:frame animated:NO];
[strongSelf visibleViewDelegateForIndex:index];
}
};
滚动至指定栏目下
[NSSet set] set 可以实现散列之间的相加相减
合理管理无序数组
Model 里面做判断 ; 做部分业务处理 ;
在 model 里面调接口有挑战
定义个性的时候 , 可以采用枚举
cellType
在 .m 文件中定义一个
setCellType {
switch(cellType){
}
}
先需要 registerClass 或者 registerNib 就可以了
tableView 定制 cell 的另一种方法
[tableView dequeueReusableCellWithIdentifier:<#(nonnull NSString *)#> forIndexPath:<#(nonnull NSIndexPath *)#>]
如果需要使用这个方法,你必须使用配套的方法来一起用,下面两个配套方法选其一:
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
3 比如你已经用NIB做了一个Cell,或者自定义了一个Cell。我们在你创建UITableView的时候,就可以顺带
self.tableView.backgroundColor = xxxx;
[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"CustomCell"];
这样你在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这个方法里,
你就可以省下这些代码:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
//设置你的cell
}
而只需要
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
那个可自动响应键盘的 ScrollView
TPKeyboardAvoidingScrollView
TPKeyboardAvoidingTableView
在cellForRowAtIndexPath中使用dequeueReuseableCellWithIdentifier:forIndexPath:获取重用的cell,若无重用的cell,将自动使用所提供的class类创建cell并返回
// 试一下这个宏
#define PROPERTY_NAME(property) [[(@""#property) componentsSeparatedByString:@"."] lastObject]
本地验证和 model 都放在用户里面
UIpickerView
UIdatepicker
MPMoviePlayerController 可以定制位置
MPMoviePlayerViewController 全屏
AVPlayer 自定义
但是 只能定义 MP4 苹果的视频;
需要些解码器
C/C ++ 跨平台的
解码器
FFmpeg 开源免费跨平台的视频 和 音频流方案
vlc
ffmpeg
强大的媒体播放器
textfield 上面的输入框为 ToolBar
在 ToolBar 上面扔 UIBarbuttonItem 就行了
pickerView 可以作为 textfield 的 inputView
NSNumber 有值 转化为字符串
ZPosition
zPosition就是cocos2d中我们常写的z吧。就是各个layer显示的次序。
zPosition不是放大缩小吧,是配置遮挡属性,比如layer1和layer2在同一个父layer上,layer1的zPosition=1,layer2的zPosition=0,layer1就会挡住layer2
发起 NSSession
NSDictionary *headers = @{ @"accept": @"application/json",
@"content-type": @"application/json",
@"apix-key": @"您的apix-key" };
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://a.apix.cn/apixlife/movie/movie?name=your_value&page=your_value&num=your_value"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
[request setAllHTTPHeaderFields:headers];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"%@", httpResponse);
}
}];
[dataTask resume];
NSArrau 需要的容器 用 json 转模型
把 jsonStr 里面的值转化为 NSString 就可以是 json 转化了
即使 jsonStr 里面的值对应是 NSArray, NSDictionary 也可以这么操作
NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:0];
for(NSInteger i = 0; i<_imageArr.count - 1; i++){
[imageArray addObject:_imageArr[i + 1]];
}
[BillApi sendBillUploadBillRequestWithImagesArray:imageArray parameterOfimages:@"request" parametersDict:nil compressionRatio:0.6 succeedBlock:^(id operation, id responseObject) {
if ([responseObject[@"status"] integerValue] == 200 ) {
[self addBillCheckListWithDataDict:responseObject[@"data"]];
}
NSLog(@"=image==resonse%@",[NSString jsonStrWithData:responseObject]);
} failedBlock:^(id operation, NSError *error) {
[MBProgressHUD showError:@"网路正忙"];
NSLog(@"=image==error%@",error);
} uploadProgressBlock:^(float uploadPercent, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"=image====%f,==%lld,=%lld",uploadPercent,totalBytesWritten,totalBytesExpectedToWrite);
}];
iOS 9 多任务分屏功能
iOS 9的分屏操作是建立在多任务之下的,所以这一点我们没有必要分开来说。实现这个操作十分简单,首先运行某个应用程序,然后从屏幕右侧向中间滑动便会弹出多任务程序卡,点击其中一个便会在右侧屏幕三分之一的位置打开。
苹果为iOS9增加了多任务分屏功能,不过苹果此次推出的分屏多任务处理功能只能够在iPad Air2上实现。
苹果为多任务操作共优化了三个功能;
苹果的多任务 , slide over 功能
调出多任务栏的功能;
1、Slide Over功能,可以让用户在两个应用之间做到快速切换,该功能可在iPad Air、iPad Air2、iPad mini2、iPad mini3上实现。
Split View 功能:
2、 分屏显示功能;
Split View功能,可将屏幕分成两部分,同时运行两个应用。两个应用可以五五对半分屏,或者是三七分屏,两个app能在同一屏幕上同时并行运作。也支持同一款应用的多界面,比如Safari浏览器中可并排摆放两个标签页。此功能目前只能在iPad Air2上实现。
Picture in Picture功能,用户在看视频过程中如果想看或回邮件,视频将以悬浮窗口的形式保留在屏幕上,大小和位置可任意调整。该功能在iPad Air、iPad mini上均可实现。
GCD 的数据类型, 各种函数名中带有 create\copy\new\retain 等字眼 , 都不需要使用这个数据的时候进行 release
CF(core Foundation)的数据类型在 ARC 环境下 还是需要做 release .
增加或者减少引用计数
serial queues通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。
用快速打开搜索一个方法或者属性可能会比较慢; 因为需要对整个项目进行索引或者搜索
工程越大, 这会变得越糟糕;
聪明的开发者 使用 xcode 使用技巧
http://www.wtoutiao.com/p/18dpJzv.html
xcode 基本操作
http://www.360doc.com/content/14/1128/13/110467_428727981.shtml
trick : 编辑断点
Condition : 设置断点的触发条件, 例如 i == 3
Ignore: 设置断点需要被忽略多少次才会中断
action 设置 action po 查看等
siblings 姐妹;
Touches系列方法会屏蔽button的点击。
itunes 可以 google 浏览器 看苹果中文的官方文档
release 版本 和 debug 版本, 版本上线时一定是 release 版本
iOS 版本更新 , 1.获取 itunes 上面的版本更新
获取app store上架版本号检查
与本地版本对照更新
NSNumber 和 keyNote 画图
size_t 类型
%zd 格式符 z 和 d 连用 转换成 size_t 类型;
size _t 为了增强程序的可移植性,便有了size_t ,不同系统上,定义size_t可能不一样。
经测试发现,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。
size_t的定义
它的定义在/usr/include/linux/types.h
typedef _kernel_size_t size_t;
跟体系结构相关
而__kernel_size_t 定义在 /usr/include/asm/posix_types.h
安装的是内核的源码
asm-i386/posix_types.h
typedef unsigned int __kernel_size_t;
asm-1a64/posix_types.h
typedef unsigned long kernel_size_t;
size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最 大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。
// 写外部声明的字符串
UIKIT_EXTERN NSString *const MJRefreshHeaderLastUpdatedTimeKey;
runtime 机制简答:
首先说一下什么是runtime:
RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用 在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何二义性。OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。
举例说明:
比如你[obj makeText];
则运行时就这样的:
首先,编译器将代码[obj makeText];转化为objc_msgSend(obj, @selector (makeText));,在objc_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针IMP跳转到对应的函数中去执行。
类对象 中存储都是减号 方法, 元类对象中存储的都是加号方法;
设置 tableView 的背景色
自定义动画程式
[self transitionFromViewController:_friendsList toViewController:_messageList duration:0.2 options:UIViewAnimationOptionAllowAnimatedContent animations:nil completion:nil];
拿到 navigation appearance 的控制权 设置字符串的颜色 :setTitleTextAttributes
星星 的渲染模式
UIImageRenderingModeAlwaysTemplate
设置 去除 navigationBar 上 的边框 ;
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
UI坐标系的 翻转;
CGContextRotateCTM(currentContext, M_PI);
CGContextScaleCTM(currentContext, -1, 1);
CGContextTranslateCTM(currentContext,0, -image.size.height);