JoanKing常用代码

获取window的三种方式(最后一种最靠谱)

UIWindow *window =   self.view.window ;
UIWindow *window =  [UIApplication sharedApplication].keyWindow;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];

简述:宏定义的后面没有符号

0.0.Block的使用

(1) 方法调用block

  1.在.h里面(建立吧bock)和设置block的方法
  typedef void(^BLOCK)(NSString *name);
  -(void)setBlock:(BLOCK)block;(在.m属性需要实现)
  2.在.m里面进行实现block方法和属性的转换
  先利用BLOCK设置一个属性 BLOCK valueBlock;
  -(void)setBlock:(BLOCK)block
  {
      valueBlock = block;
  }
  3.在点击的调用的方法里面进行调用

  valueBlock(这里放一个字符串传到外面);
  4.在外面调用

  [类的对象 setBlock:^(NSString *name) {

     这里进行执行block这个方法
 }];

(2) 属性调用block

 1.在.h里面设置2个字符串
 @property(nonatomic,strong) void(^guwen)(NSString *paGe,NSString *name);
 2.在.m里面点击调用
 if (self.guwen) {
      self.guwen(pageNumber,self.nameLabel.text);
  }
 3.在外面把值取出来
 利用这个类的对象进行调用

  累的对象.guwen = ^(NSString *paGe,NSString *name){

     在此进行调用传值
  };

0.Profile文件的设置

 platform :ios,’7.0’
 target “JLCardAnimation” do
 pod 'AFNetworking', '~> 3.1.0'
 pod 'MJExtension', '~> 3.0.13'
 pod 'SDWebImage', '~> 3.8.1'
 end

1.尺寸的宏定义

 宽高的设置
 #define WIDTH   [UIScreen mainScreen].bounds.size.width
 #define HEIGHT  [UIScreen mainScreen].bounds.size.height
 尺寸的设置
 #define iPhone5AndEarlyDevice (([[UIScreen mainScreen] bounds].size.height*[[UIScreen mainScreen] bounds].size.width <= 320*568)?YES:NO)
 #define Iphone6 (([[UIScreen mainScreen] bounds].size.height*[[UIScreen mainScreen] bounds].size.width <= 375*667)?YES:NO)

2.颜色的宏定义

 //RGB颜色
 #define CWColor(r,g,b)  [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
 //随机色(和上面的保持 一致)
 #define CWRandomColor  CWColor(arc4random_uniform(256),arc4random_uniform(256),arc4random_uniform(256))
 自定义随机色
 #define CWRandomColor  [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0  blue:arc4random_uniform(256)/255.0  alpha:1.0]

3.开发模式(名字自己起)

 #ifdef DEBUG     //处于开发阶段才打印(调试)
 #define CWLog(...) NSLog(__VA_ARGS__)
 #else            //处于发布阶段(没有输出)(发布)
 #define CWLog(...)
 #endif

4.NSUserDefaults取值,存值

//取值
#define UserDefaultObject(A) [[NSUserDefaults standardUserDefaults]objectForKey:A]
//存值(可变的值不可以存)
#define UserDefaultSetValue(B,C) [[NSUserDefaults standardUserDefaults]setObject:B forKey:C]
//存BOOL值
#define UserDefaultBool(D,E)  [[NSUserDefaults standardUserDefaults]setBool:D forKey:E]

5.弱引用

__weak typeof(self) weakSelf = self;
/*
     弱引用
 */
#define STWeakSelf __weak typeof(self) weakSelf = self;

6.判断版本是ios7以后版本

#define IOS_CURRENT_VERSION_IOS7 ([[UIDevice currentDevice].systemVersion floatValue] < 7.0 ? NO : YES)

7.打印函数,可以打印所在的函数,行数,以及你要打印的值

#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
NSLog(@"==1==%s 2==[Line %d] 3==%@", __PRETTY_FUNCTION__, __LINE__,string);

8.cell高度根据文本来确定(注意字体的大小和外面的保持一致)

CGFloat height =[@"文字的内容" boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width-20, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:11] forKey:NSFontAttributeName] context:nil].size.height;

9.请求,上拉,下拉刷新

一般都有页码和数组

NSArray *tempArray;
NSMutableArray *dataArray;
@property(nonatomic,assign) int p;

-(void)refreshData
{
self.tableView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    
    self.p = 1;
    dataArray = [[NSMutableArray alloc]init];
    [HUD showLoadingHUDWithText:@"加载中..." inView:self.view];
    //调用网络请求的方法
    [self request:1];
    
}];
self.tableView.mj_footer = [MJRefreshAutoFooter footerWithRefreshingBlock:^{
    
    self.p ++;
    [HUD showLoadingHUDWithText:@"加载中..." inView:self.view];
     //调用网络请求的方法
    [self request:self.p];
   }];
}

10.网络请求

-(void)request:(int)pp
{
  self.title = @"酒店";
  #define DFTurl @"http://192.168.80.254"
  NSString *url = [NSString stringWithFormat:@"%@/jiekou/index.php?g=home&m=index&a=jiudian&p=%d",DFTurl,pp];
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
    /*
        网络数据的请求
     */
    [[SXHTTPEngine shareManager]POST:url params:nil success:^(id responseObject) {
        
        DFTLog(@"====%@",responseObject);
        tempArray = responseObject[@"data"];
        
        tempArray = [HostelHomeModel mj_objectArrayWithKeyValuesArray:tempArray];
        [dataArray addObjectsFromArray:tempArray];
        [HUD hideHUD];
        /*
           刷新主线程
         */
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [self.tableView reloadData];
            /*
                上拉下拉刷新的截止
             */
            [self.tableView.mj_header endRefreshing];
            [self.tableView.mj_footer endRefreshing];
        });
        
    } failure:^(NSError *error) {
        
        DFTLog(@"加载失败");
        /*
                上拉下拉刷新的截止
         */
        [self.tableView.mj_header endRefreshing];
        [self.tableView.mj_footer endRefreshing];
        [HUD showLoadingHUDWithText:@"加载失败"];
        [HUD hideHUD];
    }];
  });
}

11. 设置导航栏文字的颜色以及文字大小(如导航的背景颜色,以及导航栏中间字体的颜色)

/*
设置导航栏文字的颜色以及文字大小(如导航的背景颜色,以及导航栏中间字体的颜色)
[UINavigationBar appearance];
设置Item的样式
[UIBarButtonItem appearance];
*/
//在第一次使用调用一次
+(void)initialize
{
    //设置整个项目所有item的主题样式()
    UIBarButtonItem *item = [UIBarButtonItem appearance];

    //设置普通状态的字体颜色和大小
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:CWColor(123, 123, 123),NSFontAttributeName:[UIFont systemFontOfSize:20]} forState:UIControlStateNormal];

    //设置点击的时候颜色和大小
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:CWColor(252, 108, 8),NSFontAttributeName:[UIFont systemFontOfSize:20]} forState:UIControlStateSelected];
}

导航栏上button图片防止被渲染

UIImage *img = [[UIImage imageNamed:@"icon_cog"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//宽度为负数的固定间距的系统item
UIBarButtonItem *rightNegativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[rightNegativeSpacer setWidth:-15];

UIBarButtonItem *rightBtnItem1 = [[UIBarButtonItem alloc]initWithImage:img style:UIBarButtonItemStylePlain target:self action:@selector(rightButtonItemClicked:)];
UIBarButtonItem *rightBtnItem2 = [[UIBarButtonItem alloc]initWithImage:img style:UIBarButtonItemStylePlain target:self action:@selector(rightButtonItemClicked:)];
self.navigationItem.rightBarButtonItems = @[rightNegativeSpacer,rightBtnItem1,rightBtnItem2];

12 NSData 转化我 string

/*
     1.把 NSData 转化我 string
 */

NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
/*
     2.把string 转化我 NSData
 */
NSData *data = [respondString dataUsingEncoding:NSUTF8StringEncoding]


//NSString转化为NSNumber
NSString *string = @"9000";
NSNumber *number = @([string integerValue]);
NSLog(@"number=%@",number);

//NSNumber转化为NSString
NSString *string1 = [NSString stringWithFormat:@"%@",number];
NSLog(@"string1=%@",string1);

13主线程刷新

   <1>.GCD
   dispatch_async(dispatch_get_main_queue(), ^{
     
    });
 
   <2>.NSOperation
    [[NSOperationQueue mainQueue]addOperationWithBlock:^{
        
    }];

13.改变图片的大小

 我们需要传UIImage  和  CGSize   返回的还是UIImage

- (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)newsize{
 // 创建一个bitmap的context
 // 并把它设置成为当前正在使用的context
 UIGraphicsBeginImageContext(newsize);
 // 绘制改变大小的图片
 [img drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)];
 // 从当前context中创建一个改变大小后的图片
 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
 // 使当前的context出堆栈
 UIGraphicsEndImageContext();
 // 返回新的改变大小后的图片
 return scaledImage;
}

14.有关block的使用

这仅仅是调用的展示

@property(strong,nonatomic)void(^agriculturalBtnClick)();
@property(strong,nonatomic)void(^forestryBtnClick)();
@property(strong,nonatomic)void(^AnimalBtnClick)();
-(void)homeBtnClick:(UIButton *)sender
{
   switch (sender.tag) {
    case 0:{
        if (self.agriculturalBtnClick) {
            self.agriculturalBtnClick();
        }
    }break;
    case 1:{
        if (self.forestryBtnClick) {
            self.forestryBtnClick();
        }
    }break;
    case 2:{
        if (self.AnimalBtnClick) {
            self.AnimalBtnClick();
        }
    }break;
  }
}
 /*
      下面是对方法的调用(这是cell里面的调用)
  */
  cell.agriculturalBtnClick = ^(){

   };
  cell.forestryBtnClick = ^(){

   };
  cell.AnimalBtnClick = ^(){

   };

15.一个方法的延迟执行(2s之后执行)

[self performSelector:@selector(logInShouYe) withObject:nil afterDelay:2];

16.打电话

  NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",[user objectForKey:@"电话"]];
            UIWebView * callWebview = [[UIWebView alloc] init];
            [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
            [self.view addSubview:callWebview];

17.弱引用的使用

 __weak typeof(self) Wself = self;

18.UIWebView加载连接

NSURL *url = [NSURL URLWithString:@"http://www.pgyer.com/iHLM"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

UIWebView *webView = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];

[self.view addSubview:webView];

[webView loadRequest:request];

19.按钮的点击方法(其实只是缩放率的改变,动画的加载)

按钮的点击放大,其实改变的只是按钮的transform(缩放率)

  • 下面以一个button为例
UIButton  = [UIButton buttonWithType:UIButtonTypeCustom];
self.liekBtn.frame = CGRectMake(CGRectGetMaxX(self.disLikeBtn.frame)+100 , HEIGHT*0.5, 60, 60);
[self.liekBtn setImage:[UIImage imageNamed:@"likeBtn"] forState:UIControlStateNormal];
[self.liekBtn addTarget:self action:@selector(liek) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.liekBtn];

-(void)liek {

[UIView animateWithDuration:0.5
                 animations:^{
                     self.liekBtn.transform = CGAffineTransformMakeScale(1.2, 1.2);
                    
                 } completion:^(BOOL finished) {
                     
                     self.liekBtn.transform = CGAffineTransformMakeScale(1, 1);
                  
                 }];
}

3D放大

 对象.transform3D = CATransform3DMakeScale(x, y, z);

按钮的点击放大

20.手势冲突的解决方式

//重写手势的方法 手势会影响 cell的点击
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{

if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"])
{
        return NO;
   }else{
        return YES;
   }
}

21打电话

挂代理 <UIActionSheetDelegate>

UIAlertView * alertView2 = [[UIAlertView alloc]initWithTitle:@"全国统一客服热线:4007-114-115" message:nil delegate:self cancelButtonTitle:@"拨打" otherButtonTitles:@"取消", nil];

[alertView2 show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    UIWebView*callWebview =[[UIWebView alloc] init] ;
    NSURL *telURL =[NSURL URLWithString:[NSString stringWithFormat:@"tel://4007114115"]];
    [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
    [self.backScrollView addSubview:callWebview];

    return;
}

22.导航栏的颜色

可以设置全局,也可以单独设置
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor],NSFontAttributeName : [UIFont systemFontOfSize:20]};
/颜色自己随便设置
self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.101 green:0.705 blue:0.652 alpha:1.000];

23.自定义导航控制器上面的按钮

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//设置图片的两种状态
//正常
[button setImage:[UIImage imageNamed:@"返回"] forState:UIControlStateNormal];
//选中
[button setImage:[UIImage imageNamed:@"返回"] forState:UIControlStateHighlighted];
button.frame = CGRectMake(0, 0, 30, 30);
[button addTarget:self action:@selector(back1) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:button];

24.获取版本号

//获取版本号
NSString *version1 = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];

25.相机问题

最近做头像上传功能需要使用系统相册、相机,在调用系统相册、相机发现是英文的系统相簿界面后标题显示“photos”,但是手机语言已经设置显示中文,纠结半天,最终在info.plist设置解决问题。发现在项目的info.plist里面添加Localized resources can be mixed YES(表示是否允许应用程序获取框架库内语言)即可解决这个问题。特此记录下以便以后查看和别人解决问题。

26.两种跳转展示

  • 1.中间展示(两种写法)
中间展示
 //第一种方法
  1.挂代理<UIActionSheetDelegate>
  2.在点击的地方调用
  UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"全国统一客服热线4007-114-115" message:nil delegate:self cancelButtonTitle:@"拨打" otherButtonTitles:@"取消", nil];
  [alertView show];
  3.方法调用
  - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
 {
      if (buttonIndex == 0)
     {
          NSLog(@"拨打");

     }else if (buttonIndex == 1)
     {
           NSLog(@"取消");
     }  
 }

//第二种方法(方法里面直接调用:不用挂代理)

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"全国统一客服热线4007-114-115" message:nil preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"拨打" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
    NSLog(@"拨打");
    
}];

UIAlertAction *alertAction2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
     NSLog(@"取消");
}];

[alertController addAction:alertAction];
[alertController addAction:alertAction2];

[self presentViewController:alertController animated:YES completion:nil];
  • 2.下面展示
下面展示
//第一种方法
1.第一种挂代理<UIActionSheetDelegate>
2.在点击的地方调用
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"从手机选择", @"拍照", nil];
sheet.actionSheetStyle = UIBarStyleDefault;
[sheet showInView:self.view];
3.方法调用
 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
 {
     if (buttonIndex == 0)
    {
           NSLog(@"我是从手机选择");

    }else if (buttonIndex == 1)
    {
           NSLog(@"我是拍照");
    }
 }

 //第二种方法(方法里面直接调用:不用挂代理)

  UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"从手机选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
    NSLog(@"从手机选择");
    
}];

UIAlertAction *alertAction1 = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
     NSLog(@"拍照");
}];

UIAlertAction *alertAction2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    
    NSLog(@"取消");
}];

[alertController addAction:alertAction];
[alertController addAction:alertAction1];
[alertController addAction:alertAction2];

[self presentViewController:alertController animated:YES completion:nil];

27.对控件边框的处理(如宽度,颜色)

对象(button,label...).layer.borderColor = [[UIColor blackColor] CGColor];
对象(button,label...).layer.borderWidth = 2.0f;

28.自定义导航栏标题

UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 44)];
titleLabel.text = @"登陆";
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.textColor = [UIColor blackColor];
titleLabel.font = [UIFont systemFontOfSize:15];
self.navigationItem.titleView = titleLabel;

29.静态变量的含义

static 表示只在此文件里可以访问(防止其他文件访问) const防止别人去改

 static NSString *const ID = @"cellID";

30.懒加载的一些知识点

懒加载里面都是用_,但是在外面使用都要用self. 这样才能保证数据的存在性

31.切换UICollectionViewFolowLayout

CwLineLayout 是自定义的layout

if ([self.collectionView.collectionViewLayout isKindOfClass:[CwLineLayout class]]) {
    
    [self.collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc]init] animated:YES];
}else
{
    [self.collectionView setCollectionViewLayout:[[CwLineLayout alloc]init] animated:YES];
}

31.删除指定item

 /**
  *  collectionView的点击事件
  */
 -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
  //删除模型数据(删除的指定item)
  [self.imageArray removeObjectAtIndex:indexPath.item];

  //刷新UI(这种方式比全局的好很多)
  [collectionView deleteItemsAtIndexPaths:@[indexPath]];

 }

32.textField.returnKeyType = UIReturnKeySend;

typedef NS_ENUM(NSInteger, UIReturnKeyType) {

UIReturnKeyDefault,

UIReturnKeyGo,//去往

UIReturnKeyGoogle,

UIReturnKeyJoin,//加入

UIReturnKeyNext,//下一步

UIReturnKeyRoute,

UIReturnKeySearch,//搜索

UIReturnKeySend,//发送

UIReturnKeyYahoo,

UIReturnKeyDone,//完成

UIReturnKeyEmergencyCall,

UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS(9_0),

};

33.下一个tabBar隐藏

 testViewController.hidesBottomBarWhenPushed = YES;

34. 判断手机号码格式是否正确,利用正则表达式验证

+ (BOOL)isMobileNumber:(NSString *)mobileNum
{
   if (mobileNum.length != 11)
    {
        return NO; 
    }
    /** * 手机号码:
     * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9] 
     * 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 
     * 联通号段: 130,131,132,155,156,185,186,145,176,1709 
     * 电信号段: 133,153,180,181,189,177,1700 
     */ 
     NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|70)\d{8}$";
     /** * 中国移动:China Mobile 
      * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705
      */ 
      NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\d{8}$)|(^1705\d{7}$)"; 
      /** * 中国联通:China Unicom
       * 130,131,132,155,156,185,186,145,176,1709 
       */
       NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\d{8}$)|(^1709\d{7}$)"; 
       /** * 中国电信:China Telecom
        * 133,153,180,181,189,177,1700 
        */
       NSString *CT = @"(^1(33|53|77|8[019])\d{8}$)|(^1700\d{7}$)"; 
       NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; 
       NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; 
       NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; 
       NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; 
      if (([regextestmobile evaluateWithObject:mobileNum] == YES) || ([regextestcm evaluateWithObject:mobileNum] == YES) || ([regextestct evaluateWithObject:mobileNum] == YES) || ([regextestcu evaluateWithObject:mobileNum] == YES))
       {
           return YES; 
       } 
       else
       { 
           return NO;
       }
  }

35. 判断邮箱格式是否正确,利用正则表达式验证

 + (BOOL)isAvailableEmail:(NSString *)email
 { 
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    return [emailTest evaluateWithObject:email];
 }

36. 判断字符串中是否含有空格

 + (BOOL)isHaveSpaceInString:(NSString *)string
 {
    NSRange _range = [string rangeOfString:@" "]; 
    if (_range.location != NSNotFound) 
    { 
       return YES; 
    }else
    { 
        return NO; 
    }
  }

37. 判断字符串中是否含有中文

   + (BOOL)isHaveChineseInString:(NSString *)string
   { 
      for(NSInteger i = 0; i < [string length]; i++)
      { 
           int a = [string characterAtIndex:i];
           if (a > 0x4e00 && a < 0x9fff) 
           {
                return YES;
           } 
      } 
       return NO;
    }

38. 判断字符串是否全部为数字

   + (BOOL)isAllNum:(NSString *)string
   {
      unichar c;
      for (int i=0; i<string.length; i++) {         c="[string characterAtIndex:i];"         if (!isdigit(c)) {=""             return no;=""         }=""     }=""     return yes;="" }<="" pre=""><p>判断是否是纯数字</p><pre class="brush:js;toolbar:false">+ (BOOL)isPureInteger:(NSString *)str {
      NSScanner *scanner = [NSScanner scannerWithString:str];
      NSInteger val;
      return [scanner scanInteger:&val] && [scanner isAtEnd];
   }

39. 过滤一些特殊字符 似乎只能去除头尾的特殊字符(不准)

+ (NSString *)filterSpecialWithString:(NSString *)string
{
     // 定义一个特殊字符的集合 
     NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString: @ "@/:;: ;()?「」"、[]{}#%-*+=_|~<>$?^?'@#$%^&*()_+'"]; 
     // 过滤字符串的特殊字符 
    NSString *newString = [string stringByTrimmingCharactersInSet:set]; return newString;
}

40. 让iOS应用直接退出

 + (void)backOutApp 
 { 
     UIWindow *window = [[UIApplication sharedApplication].delegate window];
     [UIView animateWithDuration:1.0f animations:^{
        window.alpha = 0; 
      } completion:^(BOOL finished) 
      {
         exit(0); 
      }];
  }

41 NSArray 快速求总和、最大值、最小值、平均值

+ (NSString *)caculateArray:(NSArray *)array
{ 
   CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue]; 
   CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue]; 
   CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue]; 
   CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
   NSLog(@"%fn%fn%fn%f",sum,avg,max,min); 
   return [NSString stringWithFormat:@"%f",sum];
}

42.生成八位随机字符串(一般是RSA加密或者DES加密使用)

- (NSString *)shuffledAlphabet {
NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Get the characters into a C array for efficient shuffling
NSUInteger numberOfCharacters = [alphabet length];
unichar *characters = calloc(numberOfCharacters, sizeof(unichar));
[alphabet getCharacters:characters range:NSMakeRange(0, numberOfCharacters)];

// Perform a Fisher-Yates shuffle
for (NSUInteger i = 0; i < numberOfCharacters; ++i) {
    NSUInteger j = (arc4random_uniform((float)numberOfCharacters - i) + i);
    unichar c = characters[i];
    characters[i] = characters[j];
    characters[j] = c;
}

   // Turn the result back into a string
   NSString *result = [NSString stringWithCharacters:characters length:8];
free(characters);
   return result;
}

43.判断是真机还是模拟器

   #if TARGET_OS_IPHONE
   //iPhone Device
   #endif
   #if TARGET_IPHONE_SIMULATOR
   //iPhone Simulator
   #endif

44.GCD 的宏定义

很多小伙伴都非常烦写GCD的方法,所以在此定义为宏使用更加方便简洁!如下图


//GCD - 一次性执行
#define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);
//GCD - 在Main线程上运行
#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);
//GCD - 开启异步线程
#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);

45.判断当前的iPhone设备/系统版本

//判断是否为iPhone
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
//判断是否为iPad
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
//判断是否为ipod
#define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"])
// 判断是否为 iPhone 5SE
#define iPhone5SE [[UIScreen mainScreen] bounds].size.width == 320.0f && [[UIScreen mainScreen] bounds].size.height == 568.0f
// 判断是否为iPhone 6/6s
#define iPhone6_6s [[UIScreen mainScreen] bounds].size.width == 375.0f && [[UIScreen mainScreen] bounds].size.height == 667.0f
// 判断是否为iPhone 6Plus/6sPlus
#define iPhone6Plus_6sPlus [[UIScreen mainScreen] bounds].size.width == 414.0f && [[UIScreen mainScreen] bounds].size.height == 736.0f
//获取系统版本
#define IOS_SYSTEM_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
//判断 iOS 8 或更高的系统版本
#define IOS_VERSION_8_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue] >=8.0)? (YES):(NO))

46.获取当前语言

#define LRCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])

47.“Info.plist”中将要使用的URL Schemes列为白名单

当你的应用在iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:

<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 微信 URL Scheme 白名单-->
<string>wechat</string>
<string>weixin</string>

<!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>

<!-- QQ、Qzone URL Scheme 白名单-->
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdk</string>

<!-- 支付宝  URL Scheme 白名单-->
<string>alipay</string>
<string>alipayshare</string>

</array>

48.将秒转化为时间字符串

秒数
float currentPlayTime = 64;
//将秒转化为时间字符串
NSString *currentTimeStr =  [self convertDuraion:currentPlayTime];
- (NSString *)convertDuraion:(float)duraion{

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:duraion];

    NSDateFormatter *dateFormate = [[NSDateFormatter alloc]init];

    dateFormate.dateFormat = @"mm:ss";

    return [dateFormate stringFromDate:date];

}

49.有关字符串

  NSString *string1 = @"0123456789";
  NSRange range1 = NSMakeRange(1, 4);//NSMakeRange这个函数的作用是从第0位开始计算,长度为4
  NSLog(@"从第1个字符开始,长度为4的字符串是:%@",[string1 substringWithRange:range1]);
  NSLog(@"抽取从头开始到第4个字符:%@",[string1 substringToIndex:4]);
  NSLog(@"抽取从第6个字符开始到末尾:%@",[string1 substringFromIndex:6]);

  NSString *string2 = @"wo shi xiao bai zhu";
  NSRange range2 = [string2 rangeOfString:@"bai"];
  if (range2.length > 0) {
       NSLog(@"{字符串中“bai”的位置,长度}==%@",NSStringFromRange(range2));
   }
   //判断在一串字符串中是否找到某个字符串
   NSRange range3 = [string2 rangeOfString:@"zhu"];
  if (range3.location != NSNotFound) {
      NSLog(@"找到了@“zhu”这个字符串!");
  }
  else
  {
     NSLog(@"没找到!");
  }

50.交换两个值(异或)

交换值

51.角度转弧度

宏定义: #define angle2radion(angle)  ((angle) / 180.0 * M_PI)

52.获取当前的系统时间(以日历表为例)

//获取当前日历对象
NSCalendar  *calendar =[NSCalendar currentCalendar];
//获取日期的组件,年月日,时分秒
//components: 需要获取日期组件
//formDate:获取哪个日期组件
//经验:以后枚举中有移位运算符(<<),一般来说我们就可以用 |  :"并" 的方式
NSDateComponents  *dateComponents = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
NSLog(@"小时==%ld",dateComponents.hour);
NSLog(@"分钟==%ld",dateComponents.minute);
NSLog(@"秒==%ld",dateComponents.second);

53.点转化为对象

[NSValue valueWithCGPoint:CGPointMake(arc4random_uniform(500), arc4random_uniform(500))];

54.隐藏tabBar

   控制器对象.hidesBottomBarWhenPushed = YES;(比较好)

55.刷新指定section或者row

//一个section刷新
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:indexPath.section];

[_tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

//一个cell刷新
NSIndexPath *indexPath1=[NSIndexPath indexPathForRow:3 inSection:0];

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath1,nil] withRowAnimation:UITableViewRowAnimationNone];

56. 遍历字典

NSDictionary *dict = [NSDictionary new];

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    
    // key 是键
    // obj 是值
    
}];

57. NSTimer定时器

创建定时器
NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(click1) userInfo:nil repeats:YES];
暂停
    [timer setFireDate:[NSDate distantFuture]];
继续
    [timer setFireDate:[NSDate date]];
关闭定时器
    [timer invalidate];

58.两张图片的合成

/**
 *  3.将两个图片合成
 */
dispatch_group_notify(group, queue, ^{
    /**
     *  开启新的图形上下文
     */
    UIGraphicsBeginImageContext(CGSizeMake(200, 200));
    
    //绘制图片
    [self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
    //绘制图片
    [self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
    
    /**
     *  取得上下文里面的图片
     */
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    /**
     *  结束上下文
     */
    UIGraphicsEndImageContext();
    
    /**
     *  4.进入主队列加载合成的图片
     */
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
        self.imageView.image = image;
        
    });
59沙盒路径
//获取整个程序所在目录
NSString *homePath=NSHomeDirectory();
NSLog(@"%@",homePath);
//获取.app文件目录
NSString *appPath=[[NSBundle mainBundle]bundlePath];
NSLog(@"%@",appPath);
//Documents目录
NSArray *arr1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@",[arr1 objectAtIndex:0]);
//Library目录
NSArray *arr2=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSLog(@"%@",[arr2 objectAtIndex:0]);
//Caches目录,在Library下面
NSArray *arr3=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSLog(@"%@",[arr3 objectAtIndex:0]);
//tmp目录
NSString *tmpPath=NSTemporaryDirectory();
NSLog(@"%@",tmpPath);
//用整个程序目录加上tmp就拼凑出tmp目录,其他目录都可这样完成
NSString *tmpPath_1=[homePath stringByAppendingPathComponent:@"tmp"];
NSLog(@"%@",tmpPath_1);

60.几个常用的正则表达式

  //邮箱
  + (BOOL) validateEmail:(NSString *)email
  {
     NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
     NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
     return [emailTest evaluateWithObject:email];
  }

 //手机号码验证
 + (BOOL) validateMobile:(NSString *)mobile
 {
     //手机号以13, 15,18开头,八个 \d 数字字符
     NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";
     NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
     return [phoneTest evaluateWithObject:mobile];
}

//车牌号验证
+ (BOOL) validateCarNo:(NSString *)carNo
{
    NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
    NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];
    NSLog(@"carTest is %@",carTest);
    return [carTest evaluateWithObject:carNo];
 }

//车型
+ (BOOL) validateCarType:(NSString *)CarType
{
    NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$";
    NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex];
    return [carTest evaluateWithObject:CarType];
}

//用户名
+ (BOOL) validateUserName:(NSString *)name
{
   NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$";
   NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex];
   BOOL B = [userNamePredicate evaluateWithObject:name];
   return B;
}

//密码
+ (BOOL) validatePassword:(NSString *)passWord
{
   NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$";
   NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex];
   return [passWordPredicate evaluateWithObject:passWord];
}

 //以下验证不计算长度
 //1、验证字符串
 - (BOOL)validateNickname:(NSString *)nickname {
     // 不包含特殊字符
    // 特殊字符包含`、-、=、\、[、]、;、'、,、.、/、~、!、@、#、$、%、^、&、*、(、)、_、+、|、?、>、<、"、:、{、}
    NSString *nicknameRegex = @".*[-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]+.*";
    NSPredicate *nicknamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", nicknameRegex];
    return ![nicknamePredicate evaluateWithObject:nickname];
}

 //2、验证密码
 - (BOOL)validatePassword:(NSString *)password {
    // 特殊字符包含`、-、=、\、[、]、;、'、,、.、/、~、!、@、#、$、%、^、&、*、(、)、_、+、|、?、>、<、"、:、{、}
    // 必须包含数字和字母,可以包含上述特殊字符。
    // 依次为(如果包含特殊字符)
    // 数字 字母 特殊
    // 字母 数字 特殊
    // 数字 特殊 字母
    // 字母 特殊 数字
    // 特殊 数字 字母
    // 特殊 字母 数字
     NSString *passWordRegex = @"(\\d+[a-zA-Z]+[-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*)|([a-zA-Z]+\\d+[-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*)|(\\d+[-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*[a-zA-Z]+)|([a-zA-Z]+[-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*\\d+)|([-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*\\d+[a-zA-Z]+)|([-`=\\\[\\];',./~!@#$%^&*()_+|{}:\"<>?]*[a-zA-Z]+\\d+)";
     NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", passWordRegex];
     return [passWordPredicate evaluateWithObject:password];
 }

//昵称
+ (BOOL) validateNickname:(NSString *)nickname
{
   NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$";
   NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex];
   return [passWordPredicate evaluateWithObject:nickname];
}

 //身份证号
  + (BOOL) validateIdentityCard: (NSString *)identityCard
  {
       BOOL flag;
       if (identityCard.length <= 0) {
           flag = NO;
            return flag;
       }
       NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
       NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
      return [identityCardPredicate evaluateWithObject:identityCard];
 }

61.打印方式

 NSLog(@"控制器名字=%s 第%d行",__PRETTY_FUNCTION__, __LINE__);

62.控制屏幕旋转,在控制器中写

/** 是否支持自动转屏 */
- (BOOL)shouldAutorotate {
    return YES;
}

/** 支持哪些屏幕方向 */
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
   return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

/** 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法) */
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

63.几个常用权限判断

if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {
    NSLog(@"没有定位权限");
}
AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (statusVideo == AVAuthorizationStatusDenied) {
    NSLog(@"没有摄像头权限");
}
//是否有麦克风权限
AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
if (statusAudio == AVAuthorizationStatusDenied) {
    NSLog(@"没有录音权限");
}
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    if (status == PHAuthorizationStatusDenied) {
        NSLog(@"没有相册权限");
    }
}];

64.获取手机和app信息

 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
 CFShow(infoDictionary);  
 // app名称  
 NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
 // app版本  
 NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
 // app build版本  
 NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];  



//手机序列号  
NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];  
NSLog(@"手机序列号: %@",identifierNumber);  
//手机别名: 用户定义的名称  
NSString* userPhoneName = [[UIDevice currentDevice] name];  
NSLog(@"手机别名: %@", userPhoneName);  
//设备名称  
NSString* deviceName = [[UIDevice currentDevice] systemName];  
NSLog(@"设备名称: %@",deviceName );  
//手机系统版本  
NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];  
NSLog(@"手机系统版本: %@", phoneVersion);  
//手机型号  
NSString* phoneModel = [[UIDevice currentDevice] model];  
NSLog(@"手机型号: %@",phoneModel );  
//地方型号  (国际化区域名称)  
NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];  
NSLog(@"国际化区域名称: %@",localPhoneModel );  

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];  
// 当前应用名称  
NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];  
NSLog(@"当前应用名称:%@",appCurName);  
// 当前应用软件版本  比如:1.0.1  
NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];  
NSLog(@"当前应用软件版本:%@",appCurVersion);  
// 当前应用版本号码   int类型  
NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];  
NSLog(@"当前应用版本号码:%@",appCurVersionNum);

65.移除字符串中的空格和换行

 + (NSString *)removeSpaceAndNewline:(NSString *)str {
     NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
     temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
     temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
     return temp;
 }

66.判断字符串中是否有空格

+ (BOOL)isBlank:(NSString *)str {
    NSRange _range = [str rangeOfString:@" "];
    if (_range.location != NSNotFound) {
       //有空格
       return YES;
    } else {
      //没有空格
       return NO;
    }
}

67.获取一个视频的第一帧图片

NSURL *url = [NSURL URLWithString:filepath];
AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];

return one;

68.获取视频的时长

+ (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {
   NSURL *videoUrl = [NSURL URLWithString:urlString];
   AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];
   CMTime time = [avUrl duration];
   int seconds = ceil(time.value/time.timescale);
   return seconds;
}

69.isKindOfClass和isMemberOfClass的区别

isKindOfClass可以判断某个对象是否属于某个类,或者这个类的子类。
isMemberOfClass更加精准,它只能判断这个对象类型是否为这个类(不能判断子类)

70.将tableView滚动到顶部

[tableView setContentOffset:CGPointZero animated:YES];
或者
[tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

71.UILabel设置内边距

子类化UILabel,重写drawTextInRect方法
- (void)drawTextInRect:(CGRect)rect {
// 边距,上左下右
  UIEdgeInsets insets = {0, 5, 0, 5};
  [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
 }

72.UILabel设置文字描边

子类化UILabel,重写drawTextInRect方法
- (void)drawTextInRect:(CGRect)rect
{
CGContextRef c = UIGraphicsGetCurrentContext();
// 设置描边宽度
CGContextSetLineWidth(c, 1);
CGContextSetLineJoin(c, kCGLineJoinRound);
CGContextSetTextDrawingMode(c, kCGTextStroke);
// 描边颜色
self.textColor = [UIColor redColor];
[super drawTextInRect:rect];
// 文本颜色
self.textColor = [UIColor yellowColor];
CGContextSetTextDrawingMode(c, kCGTextFill);
[super drawTextInRect:rect];
}

73.scrollView滚动到最下边

CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height);
[scrollView setContentOffset:bottomOffset animated:YES];

74.UIView背景颜色渐变

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
[self.view addSubview:view];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[view.layer insertSublayer:gradient atIndex:0];

75.将一个view放置在其兄弟视图的最上面

 [parentView bringSubviewToFront:yourView]

76.将一个view放置在其兄弟视图的最下面

 [parentView sendSubviewToBack:yourView]

77.让手机震动一下

倒入框架
#import 
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
或者
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

78.layoutSubviews方法什么时候调用?

 1、init方法不会调用
 2、addSubview方法等时候会调用
 3、bounds改变的时候调用
 4、scrollView滚动的时候会调用scrollView的    
    layoutSubviews方法(所以不建议在scrollView的layoutSubviews方法中做复杂逻辑)
 5、旋转设备的时候调用
 6、子视图被移除的时候调用

79.让UILabel在指定的地方换行

// 换行符为\n,在需要换行的地方加上这个符号即可,如 
label.numberOfLines = 0;
label.text = @"此处\n换行";

80.摇一摇功能

1、打开摇一摇功能
 [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
 2、让需要摇动的控制器成为第一响应者
 [self becomeFirstResponder];
 3、实现以下方法

  // 开始摇动
  - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
  // 取消摇动
  - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
  // 摇动结束
  - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

81.获取view的坐标在整个window上的位置

// v上的(0, 0)点在toView上的位置
CGPoint point = [v convertPoint:CGPointMake(0, 0) toView:[UIApplication sharedApplication].windows.lastObject];
或者
CGPoint point = [v.superview convertPoint:v.frame.origin toView:[UIApplication sharedApplication].windows.lastObject];

82.提交App Store审核程序限制

您的应用程序的未压缩大小必须小于4GB。每个Mach-O可执行文件(例如app_name.app/app_name)不能超过这些限制:
对于MinimumOSVersion小于7.0的应用程序:TEXT二进制文件中所有部分的总数最多为80 MB 。
对于MinimumOSVersion7.x到8.x的应用程序:TEXT对于二进制文件中每个体系结构片段的每个片段,最大为60 MB 。
对于MinimumOSVersion9.0或更高版本的应用程序:__TEXT二进制文件中所有部分的总数最多为500 MB 。参阅:iTunes Connect开发者指南

83.修改UISegmentedControl的字体大小

[segment setTitleTextAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15.0f]} forState:UIControlStateNormal];

84.在非ViewController的地方弹出UIAlertController对话框

//  最好抽成一个分类
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];

id rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
If([rootViewController isKindOfClass:[UINavigationController class]])
{
   rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
}
if([rootViewController isKindOfClass:[UITabBarController class]])
{
    rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
}
 [rootViewController presentViewController:alertController animated:YES completion:nil];

85.获取一个view所属的控制器

 // view分类方法
 - (UIViewController *)belongViewController {
for (UIView *next = [self superview]; next; next = next.superview) {
    UIResponder* nextResponder = [next nextResponder];
    if ([nextResponder isKindOfClass:[UIViewController class]]) {
        return (UIViewController *)nextResponder;
    }
}
   return nil;
}

86.UIImage和base64互转

 // view分类方法
 - (NSString *)encodeToBase64String:(UIImage *)image {
 return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
 }

- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
  NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
  return [UIImage imageWithData:data];
}

87.UIWebView设置背景透明

 [webView setBackgroundColor:[UIColor clearColor]];
 [webView setOpaque:NO];

88.判断NSDate是不是今天

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] && [today month] == [otherDay month] &&[today year] == [otherDay year] && [today era] == [otherDay era]) {
    // 是今天
}

89.设置tableView分割线颜色

 [self.tableView setSeparatorColor:[UIColor myColor]];

90.设置屏幕方向

 [[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeLeft) forKey:@"orientation"];

91.UITextView中打开或禁用复制,剪切,选择,全选等功能

// 继承UITextView重写这个方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    // 返回NO为禁用,YES为开启
    // 粘贴
    if (action == @selector(paste:)) return NO;
    // 剪切
    if (action == @selector(cut:)) return NO;
    // 复制
    if (action == @selector(copy:)) return NO;
    // 选择
    if (action == @selector(select:)) return NO;
    // 选中全部
    if (action == @selector(selectAll:)) return NO;
    // 删
    if (action == @selector(delete:)) return NO;
    // 分享
    if (action == @selector(share)) return NO;
       return [super canPerformAction:action withSender:sender];
 }

92.屏幕截图

  /**
   *    @brief  屏幕截图
   */
  + (UIImage *)screenShotWithView:(UIView *)v;

  + (UIImage *)screenShotWithView:(UIView *)v;
  {
     UIGraphicsBeginImageContext(v.frame.size);
     [v.layer renderInContext:UIGraphicsGetCurrentContext()];
     UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
     return img;
   }

93.获取视频的第一帧图片

 -(UIImage *)videoUrl:(NSString *)url{

     NSURL *urlString = [NSURL URLWithString:url];
     AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:urlString options:nil];
     AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
     generate1.appliesPreferredTrackTransform = YES;
     NSError *err = NULL;
     CMTime time = CMTimeMake(1, 2);
     CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
     UIImage *oneImage = [[UIImage alloc] initWithCGImage:oneRef];

     return oneImage;
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容