iOS 一些常用方法笔记

全局引用:
BOOL state
其他地方:extern BOOL state;
两种特例:
@synthesize id=_id;
@synthesize descriptoin=_description;
_和self的区别:
有setter和getter方法(@property(nomatic ,passion) UIView *view)时,两者堵可以,
当只是属性({   e.g.: UIView *_view  })时,只能”_”


retain 是指针拷贝,copy 是内容拷贝。
通过@synthesize 指令告诉编译器在编译期间产生getter/setter方法。 2:通过@dynamic指令,自己实现方法。
位置请求授权:NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription


1.mrc.arc 混编:
2.mrc下编译环境下使用arc  -fobjc-arc
反之 :-fno-objc-arc
3.init 方法,初始化和shared方法
4.要想在block块内使用局部变量,需要在block外加上”__block 变量名"
5.
1. //获取应用程序沙盒的Documents目录      NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);  
2.     NSString *plistPath1 = [paths objectAtIndex:0]; 
3.      
4.     //得到完整的文件名 
5.     NSString *filename=[plistPath1 stringByAppendingPathComponent:@"test.plist"]; 
6.    //输入写入 
7.     [data writeToFile:filename atomically:YES]; 
8.      
9.     //那怎么证明我的数据写入了呢?读出来看看 
10.     NSMutableDictionary *data1 = [[NSMutableDictionary alloc] initWithContentsOfFile:filename]; 
11.     NSLog(@"%@", data1);    
12.
13.
14. @(20):这表示一个对象
15. 抽象类:用来派生子类
16. #define  如果定义太长 在换行时加“\”
17. frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
18. 重绘 setNeedsDisplay,调用drawrect, 刷新布局: setNeedsLayout,调用 layoutSubViews,

调用定位时在target里设置两个属性:NSLocationAlwaysUsageDescription  NSLocationWhenInUseUsageDescription
Xcode升级后不支持http访问的解决办法:在Info.plist中添加NSAppTransportSecurity类型Dictionary。
    在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

 

1、 发送短信
 // 如果利用该方式发送短信, 当短信发送完毕或者取消之后不会返回应用程序
//        NSURL *url = [NSURL URLWithString:@"sms://10010"];
//        [[UIApplication sharedApplication] openURL:url];
        
        // 判断当前设备能否发送短信
        if (![MFMessageComposeViewController canSendText]) {
            NSLog(@"当前设备不能发送短信");
            return ;
        }
        
        MFMessageComposeViewController *vc = [[MFMessageComposeViewController alloc] init];
        // 设置短信内容
        vc.body = @"吃饭了没?";
        // 设置收件人列表
        vc.recipients = @[@"10010"];
        // 设置代理
        vc.messageComposeDelegate = self;
        // 显示控制器
        [self presentViewController:vc animated:YES completion:nil];

2. 打电话

        // 弊端:使用该方法进行拨号之后,当电话挂断之后不会返回应用程序, 会停留在通话记录界面
//        NSURL *url = [NSURL URLWithString:@"tel://13261936021"];
//        [[UIApplication sharedApplication] openURL:url];
        
        // 在拨打电话之后会提示用户是否拨打, 当电话挂断之后会返回应用程序
//        NSURL *url = [NSURL URLWithString:@"telprompt://13261936021"];
//        [[UIApplication sharedApplication] openURL:url];

 3. 冒泡排序算法

for (i = 0; i < length - 1; ++i)// 趟次  

    {  

        for (j = i + 1; j < length; ++j)  

        {  

            if (arr[i] > arr[j])  

            {  

                tmp = arr[i];  

                arr[i] = arr[j];  

                arr[j] = tmp;  

            }  

        }  

    } 

4.  图片从中间拉伸
// 左端盖宽度
    NSInteger leftCapWidth = bgImage.size.width * 0.5f;
    // 顶端盖高度
    NSInteger topCapHeight = bgImage.size.height * 0.5f;
    
    bgImage = [bgImage stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];

5.弹出动画
//出厂动画
- (void)animationWith:(UIView *)view
{
    
    CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    animation.duration = 0.5;
    
    NSMutableArray *values = [NSMutableArray array];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
    animation.values = values;
    [view.layer addAnimation:animation forKey:nil];
    
    
}

6.经常容易出错的和遗漏的地方
    设置tag值时必须大于100,  tableView 的头尾高度 不能设置为0.。可以是0.001
7.
处理键盘弹出事件, 调整搜索框的高度
  -(void)registNoti{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shown:) name:UIKeyboardWillShowNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHidden:) name:UIKeyboardWillHideNotification object:nil];

    

}

// 键盘显示
-(void) shown:(NSNotification*) notification
{
    // keyboardFrame
    CGRect initialFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
    CGRect convertedFrame = [self.view convertRect:initialFrame fromView:nil];
    
    CGRect tvFrame = self.infoTabaleView.frame ;
    tvFrame.size.height = convertedFrame.origin.y - 60;
    self.infoTabaleView.frame = tvFrame ;
    
}

// 键盘隐藏
-(void) keyboardHidden:(NSNotification*) notification
{
    CGRect tvFrame = self.infoTabaleView.frame;
    tvFrame.size.height = _initialTVHeight;
    self.infoTabaleView.frame = tvFrame;
}


清理缓存
UIAlertView * alert =[ [UIAlertView alloc]initWithTitle:@"提示" message:@"是否删除缓存" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
    
    NSString * documentPath =[NSString stringWithFormat:@"%@/Documents",NSHomeDirectory()];
    NSLog(@"%@",documentPath);
    BOOL isDataExist=[[NSFileManager defaultManager]fileExistsAtPath:documentPath];
    NSLog(@"~~~~~~~%d",isDataExist);
    if (isDataExist)
    {
        long long content=[[[NSFileManager defaultManager]attributesOfItemAtPath:documentPath error:nil]fileSize];
        float size=content/1024.0;
        NSString * content2 = [NSString stringWithFormat:@"%.2fMB",size];
        alert.message = [@"是否删除缓存" stringByAppendingString:content2];
        [ [NSFileManager defaultManager]removeItemAtPath:documentPath error:nil];
        [alert show] ;
    }
    else
    {
        alert.message = @"暂无缓存";
        [alert show];
    }

图片裁剪: 比如星际显示的时候:
 starImageView.contentMode=UIViewContentModeLeft;
    //设置剪裁
    starImageView.clipsToBounds=YES;
    float x=65/5.0*num;
    starImageView.frame=CGRectMake(0, 0, x, 23);

判断版本号:
 NSString *key = @"CFBundleVersion";
    
    // 取出沙盒中存储的上次使用软件的版本号
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *lastVersion = [defaults stringForKey:key];
    
    // 获得当前软件的版本号
    NSString *currentVersion = [NSBundle mainBundle].infoDictionary[key];
    
    if ([currentVersion isEqualToString:lastVersion]) {
        // 显示状态栏
      
    } else { // 新版本
        [defaults setObject:currentVersion forKey:key];
        [defaults synchronize];
    }


根据颜色得到图片
- (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}
// 得当前View上的图片
+ (UIImage *)captureImageWithView:(UIView *)view
{
    // 1.创建bitmap上下文
    UIGraphicsBeginImageContext(view.frame.size);
    // 2.将要保存的view的layer绘制到bitmap上下文中
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    // 3.取出绘制号的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    return newImage;
}

 

1.修改复制粘贴显示英文
/*
 如何修改系统语言显示英文(复制,粘贴)
 解决办法是用vim直接打开工程的Info.plist文件,在文件中增加如下内容即可
 <key>CFBundleLocalizations</key>
 <array>
        <string>zh_CN</string>
        <string>en</string>
 </array>
 
 */
另一种方式:修改Info.plist文件的Localization native development region属性值为China
2.图片压缩
 + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
  {
  // Create a graphics image context
  UIGraphicsBeginImageContext(newSize);
  // Tell the old image to draw in this new context, with the desired
  // new size
  [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
  // Get the new image from the context
  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  // End the context
  UIGraphicsEndImageContext();
  // Return the new image.
  return newImage;
  }
3.javascript
    //<1>获取当前页面的url
    NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
    NSLog(@"currentURL = %@",currentURL);
    
    //<2>获取当前界面的title
    NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSLog(@"title = %@",title);

4.  程序启动时每次收到推送 或 程序未启动通过推送消息启动程序时,都将会触发appdelegate里面的方法(注意要跟服务器的证书一直,比如开发环境,服务器也要用开发证书的pem才行):
- ( void )application:( UIApplication *)application didReceiveRemoteNotification:( NSDictionary *)userInfo
{
//////////这里是收到推送后的逻辑代码
// 需要  #import <AudioToolbox/AudioToolbox.h>
AudioServicesPlaySystemSound (1007); //系统的通知声音
AudioServicesPlayAlertSound ( kSystemSoundID_Vibrate );//震动
//自定义声音
NSString *path = [[ NSBundle mainBundle ] pathForResource : @"message" ofType : @"wav" ];
// 组装并播放音效
SystemSoundID soundID;
NSURL *filePath = [ NSURL fileURLWithPath :path isDirectory : NO ];
AudioServicesCreateSystemSoundID (( __bridge CFURLRef )filePath, &soundID);
AudioServicesPlaySystemSound (soundID);
// 声音停止
AudioServicesDisposeSystemSoundID (soundID);
}
*         userInfo默认包含以下内容:
aps =  {
alert = "";//推送显示的问题信息在这里
badge = 0;//app的icon右上角的推送数字 在这里设置
sound = "";
};
*         如果需要添加自定义的字段,就让服务器的小伙伴们 跟aps同一层级添加一个数组(以Json为例):
{
"aps" : { "alert" : "This is the alert text", "badge" : 1, "sound" : "default" },
"server" : { "serverId" : 1, "name" : "Server name")
}
这样收到的
userInfo里面会多一个server的字段。

posted @ 2016-05-27 16:09  凡晓晓  阅读(474)  评论(0编辑  收藏  举报