iOS常用技术
0.科学上网
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global
1.判断系统
#define UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
调用方法:
UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") //高于或等于 iOS8.0的系统
2.关于导航控制器下的高度 (以后整理)
iOS 7 : viewDidLoad中 viewDidAppear:中
iOS 8及以后:viewDidLoad中 viewDidAppear:中
3.用逗号分隔一串数字
- (void)formatMoney{ NSInteger moneyNum = ; NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; formatter.numberStyle = NSNumberFormatterDecimalStyle; NSString* formatMoney = [formatter stringFromNumber:[NSNumber numberWithInteger:moneyNum]]; NSLog(@"%@",formatMoney); }
4.nsdictionary的排序
// 按等级从小到大排序 NSArray *allKeys = [_dictLevelName allKeys]; allKeys = [allKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSString *str1 = (NSString *)obj1; NSString *str2 = (NSString *)obj2; NSInteger level1 = [str1 integerValue]; NSInteger level2 = [str2 integerValue]; return [@(level1) compare:@(level2)]; // compare:是NSNumber 的函数,不可以比较字符串,需要单独转换. }]; for (NSString *key in allKeys) { NSString *name = [_dictLevelName objectForKey:key]; if (ISSTRING(name)) { [_arrayLevelName addObject:name]; } }
5.NSAssert作用:若程序在此处崩溃,就能在不插入全局断点的情况下,崩在此处,代替全局断点的作用.
NSAssert(view, @"View must not be nil.");崩溃,倒退崩溃到了我的代码
[[PTVConfig instance] showToast:self.superview msg:@"解除屏蔽"];
是在 cell 中调用的,找不到父类 tableview 了,可见尽量少用 superview, 用父类作为代理直接处理.
6.查找最外层的控制器的方法:
UITabBarController *tabBar = (UITabBarController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];
UINavigationController *navi = tabBar.selectedViewController;
UIViewController *vc = navi.visibleViewController;
7.关于手势
- UITapGestureRecognizer
- UIPinchGestureRecognizer
- UIRotationGestureRecognizer
- UISwipeGestureRecognizer
- UIPanGestureRecognizer
- UILongPressGestureRecognizer
上面的手势对应的操作是:
- Tap(点一下)
- Pinch(二指往內或往外拨动,平时经常用到的缩放)
- Rotation(旋转)
- Swipe(滑动,快速移动)
- Pan (拖移,慢速移动)
- LongPress(长按)
8.运行 gif 图片,可以使用 UIImageView 动画. 代码如下:
- (void)test {
self.imgView.animationImages = [self animationImages]; //获取Gif图片列表
self.imgView.animationDuration = ; //执行一次完整动画所需的时长
self.imgView.animationRepeatCount = ; //动画重复次数
[self.imgView startAnimating];
} - (NSArray *)animationImages
{
NSFileManager *fielM = [NSFileManager defaultManager];
NSString *path = [[NSBundle mainBundle] pathForResource:@"vip_new_comer_tail" ofType:@"bundle"];
NSArray *arrays = [fielM contentsOfDirectoryAtPath:path error:nil]; NSMutableArray *imagesArr = [NSMutableArray array];
for (NSString *name in arrays) {
NSString *imagePath = [path stringByAppendingPathComponent:name];
NSData *data = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:data];
if (image) {
[imagesArr addObject:image];
}
}
return imagesArr;
}
9.对于字符串形式保存的用户配置,若将其转换成字典,可以先使用方法将其转换成 NSData 对象,再将该对象装换成 NSDictionary 对象.
NSString *conf = [dict objectForKey:@"conf"];
if (conf) {
NSData * data = [conf dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
NSDictionary *confDict = [NSJSONSerialization JSONObjectWithData:data options: error:nil];
}
}
10.若给父视图添加了手势,则子视图UIControl 的点击事件被触发后,会先执行父视图的手势,后执行按钮的事件.
若想阻碍父视图的按钮事件,安静地执行按钮事件,可以在手势的delegate的代理方法中,查看当前用户点击的视图,来确定是否调用父视图的代理方法.
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
} - (void)setupUI{
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onViewTouchDonw:)];
recognizer.delegate = self;
[self.view addGestureRecognizer:recognizer]; [self.btn addTarget:self action:@selector(onBtnClick:) forControlEvents:UIControlEventTouchUpInside];
} -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if([touch.view isKindOfClass:[UIButton class]])
{
NSLog(@"啦啦啦---%@",[touch.view class]); return NO;
}
return YES;
}
11.判断麦克风和相机使用权限并打开的代码,iOS系统要在 plist 中添加信任的字符串,参考iOS 10 开发适配系列之权限Crash问题- 简书.
/// 检查相机和麦克风的访问权限并提示设置
- (BOOL)checkMediaTypeVideoAndAudio{
BOOL bVideoAuthor = [self checkMediaTypeVideo];
BOOL bAudioAuthor = [self checkMediaTypeAudio]; if (bVideoAuthor && bAudioAuthor) {
return YES;
} else {
return NO;
}
} /// 检查相机的访问权限并提示设置
- (BOOL)checkMediaTypeVideo{
__block BOOL bAuthor = NO;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusNotDetermined ||
authStatus == AVAuthorizationStatusDenied ){ // 首次访问照像机权限的时候会弹出允许或不允许的对话框,后来访问失败的话,会在以下 block 中传值为 NO 的参数
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (!granted) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"请在\"设置-隐私-相机\"选项中,允许熊猫直播访问你的相机" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alertView show];
} else {
bAuthor = YES;
}
}];
}
return bAuthor;
} /// 检查麦克风的访问权限并提示设置
- (BOOL)checkMediaTypeAudio{
__block BOOL bAuthor = NO;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
if (authStatus == AVAuthorizationStatusNotDetermined ||
authStatus == AVAuthorizationStatusDenied ) { // 首次访问麦克风权限的时候会弹出允许或不允许的对话框,后来访问失败的话,会在以下 block 中传值为 NO 的参数
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
if (!granted) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"请在\"设置-隐私-麦克风\"选项中,允许熊猫直播访问你的麦克风" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alertView show];
}
}]; }
return bAuthor;
}
12.YYModel不同变量的使用方法
+ (NSDictionary *)modelCustomPropertyMapper {
NSMutableDictionary *chatMappers = [@{@"text" : @"data.text",
@"color" : @"data.color",
@"size" : @"data.size",
@"font" : @"data.font",
} mutableCopy];
NSDictionary *baseMappers = @{@"rid" : @"from.rid",
@"nick" : @"from.nick",
@"level" : @"from.level",
@"fromLevelMin" : @"from.level_min",
@"fromLevelMax" : @"from.level_max",
@"exp" : @"from.exp",
@"roleName" : @"from.role_name",
@"roleVal" : @"from.role_val",
@"xroomId" : @"to",
@"type" : @"type",
};
[chatMappers addEntriesFromDictionary:baseMappers];
return chatMappers;
}
13.YYText 在 cell 中时,获取点击的位置
- (void)onTapChatMsg:(UITapGestureRecognizer *)tap{
CGRect rect = self.chatMsgLabel.textLayout.textBoundingRect;
CGPoint point = [tap locationInView:tap.view];
if (CGRectContainsPoint(rect, point)) {
NSLog(@"被点击了");
}
}
14.选中某个 cell 的常用代码:
/// 某个 cell 是否被选中, 在 cellForItemAtIndexPath 代理方法中调用
- (void)selectedCellIfNeeded:(PXYStickerCollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath
{
if (self.lastSelectIndexPath == nil)
{
return;
}
if(indexPath.item == self.lastSelectIndexPath.item)
{
cell.backgroundColor = [UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:0.4];
cell.gradientLayer.hidden = YES;
}
else
{
cell.backgroundColor = [UIColor clearColor];
cell.gradientLayer.hidden = NO;
}
} /// 选中某个 cell, 在 didSelectItemAtIndexPath 代理方法中调用
- (void)selectingIndexPath:(NSIndexPath *)indexPath collectionView:(UICollectionView *)collectionView{ PXYStickerCollectionViewCell *cell = (PXYStickerCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:0.4];
cell.gradientLayer.hidden = YES; if (self.lastSelectIndexPath == nil)
{
self.lastSelectIndexPath = indexPath;
return;
}
else if (self.lastSelectIndexPath.item == indexPath.item)
{
return;
} PXYStickerCollectionViewCell *lastCell = (PXYStickerCollectionViewCell *)[collectionView cellForItemAtIndexPath:self.lastSelectIndexPath];
lastCell.backgroundColor = [UIColor clearColor];
lastCell.gradientLayer.hidden = NO;
self.lastSelectIndexPath = indexPath;
}
15.限制输入多少个字符
- (void)textViewDidChange:(UITextView *)textView{
NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
[self checkTextViewText:textView];
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
[self checkTextViewText:textView];
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{ }
} - (void)textViewDidEndEditing:(UITextView *)textView{
[self checkTextViewText:textView];
} - (void)checkTextViewText:(UITextView *)textView {
if (textView.text.length > kMaxInputWindPlaneEditView) {
textView.text = [textView.text substringToIndex:kMaxInputWindPlaneEditView];
[[PTVConfig instance] showToast:self msg:[NSString stringWithFormat:@"文字长度不能超过%li个字符",(long)kMaxInputWindPlaneEditView]];
}
}
16.把崩溃日志转化为具体的某一行(crash 崩溃)(参考http://www.jianshu.com/p/da186c14db0f)
(/Users/liuzhu/Library/Developer/Xcode/DerivedData/xxx-atouolfjhjicfrgglhmhmicssual/Build/Products 中含有 dsym 文件)
chmod +x symbolicatecrash
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
./symbolicatecrash .crash PandaTV-ios.app.dSYM > Control_symbol.crash
(PS:Xcode7.3
symbolicatecrash路径
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash)
17.在分类中添加属性,核心代码如下:
#import <objc/runtime.h>
@property (nonatomic,assign) CGFloat count; -(void)setCount:(CGFloat)count{
objc_setAssociatedObject(self, @selector(count), @(count), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} -(CGFloat)count{
NSNumber *count = objc_getAssociatedObject(self, @selector(count));
return count.floatValue;
}
18.若 UIScrollView 的尺寸随着其中的图片尺寸在变化,则可以设置UIViewController中的automaticallyAdjustsScrollViewInsets属性来让其不变
- (void)viewDidLoad {
[super viewDidLoad];
[self setAutomaticallyAdjustsScrollViewInsets:NO];
}
iOS常用技术的更多相关文章
- IOS开发常用技术网站
IOS常用网站: 1.http://www.cocoachina.com 2.http://oschina.net 3.http://code4app.com
- 【腾讯Bugly干货分享】iOS黑客技术大揭秘
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5791da152168f2690e72daa4 “8小时内拼工作,8小时外拼成长 ...
- React.js 常用技术要点
最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...
- iOS 必备技术点
IOS面试问题总结 分类: IOS开发2013-11-20 17:26 5873人阅读 评论(1) 收藏 举报 目录(?)[+] 通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题: ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- iOS常用基础框架
一,简述 1.1,IOS操作系统的层次架构 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ...
- iOS 开发技术体系
iOS 开发技术体系图: - 层级 | 主要框架 - ---------------------|--------------------------------------------------- ...
- iOS 开发技术栈与进阶
最近有一些开发朋友问我应该怎样提升自己的能力,回想起来做了这么久 iOS 开发,我也有过那种“让我做一个功能实现个需求我会做,但接下来怎样提高我不知道.”的时期,这里尝试列一下 iOS 开发的相关技术 ...
随机推荐
- git版本控制管理实践-4
vcs: version control system 版本控制系统 local vcs, 集中式版本控制系统: centralized vcs; 分布式vcs: distributed vcs Lo ...
- 关于ajax的提交未完再续!
$.ajax({ cache: true, type: "POST", url:"__URL__/add", data:$('#myform').seriali ...
- Fragment应用总结
1.FrameLayout 常用于作为Android自带组件的父节点 2.Fragment就是一个普通的Java类,用Android.app这个包 Fragment也是一个ListVi ...
- 浅谈JSON
JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没有 ...
- CentOS 7下安装Mono
最近的项目中需要用到Linux作为服务器,而我们的开发技术是基于.NET的,所以只能在CentOS 7上尝试着安装一下Mono,下面是具体的安装步骤: 1.安装一些必备的依赖项 yum -y inst ...
- 编程之美读书笔记之 -寻找出现次数为1的ID的问题
问题描述: 在一张表里面保存了N个ID,有N-1个ID是出现了两次的,只有一个ID只出现了一次,现在要你把这个ID找出来.如果是两个呢? 解法一: 我们先来解决一个的.假如ID的值的范围是1-k, ...
- Python基本数据类型
一.整数 int(整形) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**1-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2* ...
- iterator接口
Iterator用来做遍历,所有实现Collection接口的容器都有一个Iterator的方法以返回一个Iterator接口的对象
- linux升级openssl
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz ./config shared zlib-dynamicconfig完成后执行 ma ...
- CSS初始化样式
为什么要初始化CSS? CSS初始化是指重设浏览器的样式.不同的浏览器默认的样式可能不尽相同,所以开发时的第一件事可能就是如何把它们统一.如果没对CSS初始化往往会出现浏览器之间的页面差异.每次新开发 ...