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.关于手势

  • 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常用技术的更多相关文章

  1. IOS开发常用技术网站

    IOS常用网站:    1.http://www.cocoachina.com    2.http://oschina.net    3.http://code4app.com

  2. 【腾讯Bugly干货分享】iOS黑客技术大揭秘

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5791da152168f2690e72daa4 “8小时内拼工作,8小时外拼成长 ...

  3. React.js 常用技术要点

    最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...

  4. iOS 必备技术点

    IOS面试问题总结 分类: IOS开发2013-11-20 17:26 5873人阅读 评论(1) 收藏 举报   目录(?)[+]   通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题: ...

  5. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  6. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  7. iOS常用基础框架

    一,简述  1.1,IOS操作系统的层次架构         iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ...

  8. iOS 开发技术体系

    iOS 开发技术体系图: - 层级 | 主要框架 - ---------------------|--------------------------------------------------- ...

  9. iOS 开发技术栈与进阶

    最近有一些开发朋友问我应该怎样提升自己的能力,回想起来做了这么久 iOS 开发,我也有过那种“让我做一个功能实现个需求我会做,但接下来怎样提高我不知道.”的时期,这里尝试列一下 iOS 开发的相关技术 ...

随机推荐

  1. SQL SERVER批量修改表名前缀

    比如前缀由mms_修改为 ets_ exec   sp_msforeachtable     @command1='  declare   @o   sysname,@n   sysname     ...

  2. 使用Spring和SpringMVC管理bean时要注意的一个小细节

    最近一直在做毕业设计...用到了Shiro和SpringMVC..用过shiro的朋友都知道shiro需要自己去写Realm,然后把Realm注入到SecurityManager中.而Security ...

  3. Android ViewPager sharedpreferences

    http://www.cnblogs.com/dwinter/archive/2012/02/27/AndroidViewPager%E5%A4%9A%E9%A1%B5%E9%9D%A2%E6%BB% ...

  4. Pandas-数据聚合与分组运算

    目录 图解"split-apply-combine" 数据的分类split: groupby() 以column进行分组 以index进行分组 分组遍历 数据的应用apply: a ...

  5. App提交Appstore审核流程

    原文: https://www.douban.com/note/461351420/ 这是一个app提交到iTunces Connect被拒了4次摸索出来的经验,说多了都是泪,先让我擦擦...好了,话 ...

  6. HTTP参数污染

    HTTP Parameter Pollution简称HPP,所以有的人也称之为“HPP参数污染”. 一篇很不错关于HPP参数污染的文章:http://www.paigu.com/a/33478/235 ...

  7. 曲面之美:三星 S6 Edge+

    这些年安卓手机阵营一直拼得又激烈又惨烈,从拼配置,拼性能,拼性价比,到拼颜值拼情怀,拼得用户也都麻木了. 尤其是我这样的用户,不喜欢墨守成规,你配置高又如何,同样价钱的配置都差不多. 我想看不一样的东 ...

  8. uoj228 基础数据结构练习题

    趁别人题解没有放出来赶快写一篇 整数序列,操作 区间加 区间变成sqrt(下取整) 区间和 考虑一下对于每个区间里所有sqrt不同的段操作,那么可以在O(段数logn)一次的时间内完成sqrt操作.考 ...

  9. java程序打包成jar

    1. 建立文件夹:proj,在该文件夹下建立3个子文件夹:lib,src 2. 在lib文件夹中放置依赖的jar包 3. 在src中放置类文件:com.cnjava.demo.Main.java 4. ...

  10. 【krpano】二维码自动生成插件(源码+介绍+预览)

    简介 在krpano生成的全景支持HTML5在手机中展示,而在手机中打开全景网址时不方便,需要输入网址. 最近研究了如何让krpano全景根据自己当前的网址,自动生成二维码,并在电脑浏览时,可以展示出 ...