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. 利用Render Texture实现游戏的小雷达效果(摄影机分屏)

    最近游戏蛮牛在举办一个活动,就是要做出这样的效果: 题目:实现游戏分屏效果 要求:1.        分屏,且分割线不规则(即非水平或垂直):2.        各屏可单独操作(移动.缩放),操作指该 ...

  2. tyvj1004 滑雪

    描述     trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    例如样例中的那个矩形,可以从某 ...

  3. HTML兼容问题——HACK技术

    有话先说:本文的目的主要是向大家描述一下我们在遇见IE8版本一下以及Firefox兼容的问题. 针对不同的浏览器写不同的CSS的过程,这就叫CSS hack,也叫写CSS hack,相信您会对一些比较 ...

  4. 商品库存“存取设计”,MySQL事务、表锁、行锁

    MySQL  使用 SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation level 为 REPEATA ...

  5. Swift3.0P1 语法指南——闭包

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  6. C和指针 第五章 警告总结

    1.有符号的值得右移位操作是不可移植的 2.移位操作的位数是个负数,是未定义的 3.连续赋值的各个变量的长度 不一,导致变量值截断. #include <stdio.h> int main ...

  7. BZOJ 4725: [POI2017]Reprezentacje ró?nicowe

    Description 一个数列. \(a_1=1,a_2=2\) 当 \(n>2\) 时 \[a_n = \{  \begin {matrix} 2a_{n-1},\text{n is an ...

  8. 6个变态的C语言Hello World程序

    6个变态的C语言Hello World程序   下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C+ ...

  9. JSONObject.fromObject(map)(JSON与JAVA数据的转换)

    JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.) 上一篇文章中有这么 ...

  10. ubuntu 创建用户

    http://www.jb51.net/article/45848.htm  创建用户