iOS中的一些小功能和技巧

简介: iOS中的一些小功能和技巧

iOS中的一些小功能和技巧


1:拨打电话

方式一


NSURL *url = [NSURL URLWithString:@"tel://4000-916-416"];
            [[UIApplication sharedApplication] openURL:url];
方式一是最直接拨打电话,存在一个缺点:打电话结束之后,会停留在通讯录界面,不会跳转到APP界面
方式二


NSURL *url = [NSURL URLWithString:@"telprompt://4000-916-416"];
            [[UIApplication sharedApplication] openURL:url];
方式二,会弹出一个提示框,我们的电话号码是4-3-4的格式,但提示框的号码是3-3-4,而且这个存在一个问题是,访问私有的API,很可能存在上架时候被拒

7f83255712ff5006534ffb729fa22887.png

Snip20160822_5.png

方式三:


if (_webView == nil) {
                _webView = [[UIWebView alloc] initWithFrame:CGRectZero];
            }
            [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"tel://4000-916-416"]]];
方式三:这个是通过内嵌一个UIWebView来实现,打完电话后,会回到应用

2.发短信

第一种方法


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://110"]];
第一种方法存在的缺点:不能回到应用,而且不能指定内容
第二种方法,利用第三方框架

1、导入 MessageUI.framework 框架。

2、引入头文件 #import  ,实现代理方法  。


- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    [self dismissViewControllerAnimated:YES completion:nil];
    switch (result) {
        case MessageComposeResultCancelled:
            NSLog(@"取消发送");
            break;
        case MessageComposeResultSent:
            NSLog(@"已发送");
            break;
        case MessageComposeResultFailed:
            NSLog(@"发送失败");
            break;
        default:
            break;
    }
}

3.发送短信方法


- (void)showMessageView:(NSArray *)phones title:(NSString *)title body:(NSString *)body
{
    if([MFMessageComposeViewController canSendText]) {
        MFMessageComposeViewController * controller = [[MFMessageComposeViewController alloc] init];
        // --phones发短信的手机号码的数组,数组中是一个即单发,多个即群发。
        controller.recipients = phones;
        // --短信界面 BarButtonItem (取消按钮) 颜色
        controller.navigationBar.tintColor = [UIColor redColor];
        // --短信内容
        controller.body = body;
        controller.messageComposeDelegate = self;
        [self presentViewController:controller animated:YES completion:nil];
    }
    else
    {
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
                                                                                 message:@"该设备不支持短信功能"
                                                                          preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];
        [alertController addAction:alertAction];
        [self presentViewController:alertController animated:YES completion:nil];
    }
}

4.回调


[self showMessageView:[NSArray arrayWithObjects:@"110", nil] title:@"test" body:@"谢谢浏览凡尘一笑的文章,如果喜欢请收藏,关注,小编会不定时为您更新"];

3.更换NSLog

我们在开发阶段经常会使用NSLog来做打印调试,一个项目下来就存在好多打印,但是在发布阶段是需要将这些打印删除的,由于我们在开发中很多打印自己有时候都很难找得到,所以我们可以自己用一个来代替NSLog

在PCH文件里面使用这个,然后就可以使用SLLog来代替NSLog


/*** 日志 ***/
#ifdef DEBUG
#define SLLog(...) NSLog(__VA_ARGS__)
#else
#define SLLog(...)
#endif
其实这个意思就是如果在调试阶段我们就使用SLLog来代替NSLog 如果在发布阶段,SLLog 就用空来代替,意思是没有使用打印调试

刚才写到了一个DEBUG  这个宏 这里突然又想和大家分享一点宏的知识,我们在定义宏时候,是可以访问到宏的


fabd5ace97e9dd27ed66eaa81edf5d76.jpg

Untitle.gif

但是有时候,却发现一些访问不到,比如下面这样,然后你可能找了很久

也找不多。


358e732c20c4df28a383c236a7a0a54f.jpg

Untitlef.gif

其实要这样找才能找得到

02a310f2dcfadc1e38711bd16403157e.png

Snip20160822_12.png

4.PCH的一个注意细节


#ifndef PrefixHeader_pch
#define PrefixHeader_pch
/*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在
#ifdef __OBJC__和#endif之间 ***/
/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
#ifdef __OBJC__
#endif
/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
#endif

/*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在#ifdef OBJC和#endif之间,如果写在了里面的话会报下面这个错误 ***/

929a1cb7d8e3ed0289ef123ee83b5b7b.png

Snip20151105_8.png

5.颜色相关的宏

刚才小编给大家写那个宏的时候,写着写着就想多写一些其他东西,这个给大家写一下颜色相关的宏


/*** 颜色 ***/
#define SLColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a/255.0]
/*** RGB颜色 ***/
#define KRGB(r, g, b) SLColor((r), (g), (b), 255)
//整个项目背景颜色
#define ALLbackGroundColor KRGB(221, 226, 229)
/*** 随机颜色 ***/
#define RandomColor KRGB(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))
这里注意需要先写第一个,不让后面的宏就调用不到上面的第一个宏,因为顺序是由上到下来读的。注意这面的r g b 添加()的作用是为了严谨性,有时候写到 23 + 54这样就会存在逻辑运算符的顺序的问题,所以在定义宏的时候,给加上()

6.将数据写成Plist

来看一下基本的方法


这是接口:http://192.168.2.226:8090/api/financeapp/finance/getBids 
需要拼接的参数
pageId=1
pageSize=20
所以我们会把接口和参数一块拼接起来变成这样
http://192.168.2.226:8090/api/financeapp/finance/getBids/pageId=1/pageSize=20
然后放到goole浏览器,当然前提是浏览器装了插件

905a9cfb7e991fe04e9ed5e8a2e43546.png

Snip20160822_16.png

当然这样去查看解析的数据也是不错的,只不过要一步一步拼接参数有点麻烦

下面告诉大家其实也可以用代码实现,直接生成一个plist文件在桌面

3af362fabf035109f6c46f5f33f88a86.png

Snip20160822_17.png

然后将桌面的plist文件点开就是这样

61626d21245255398cf03be77d167cbf.png

Snip20160822_18.png

生成这个文件之后把刚才写的代码删除(避免重复创建)当然您喜欢也可以写成宏放到PCH文件里面,这里告诉大家怎么定义成宏,然后使用起来方便

f4cebe3fea6813b32efbe16691fba225.png

Snip20160822_21.png

写成宏之后的使用

663edc1f8c3df6e26004cc4f3069ee60.png

Snip20160822_24.png

7.UITableViewcell的背景色的设置

我们不应该直接使用cell.backgroundColor。Cell本身是一个UIView,我们所看到的部分其实只是它的一个Subview,也就是cell.contentView。所以,如果直接改变cell本身的背景色,依然会被cell.contentView给覆盖,没有效果。    所以,最好的方式应该是通过cell.backgroundView来改变cell的背景。按照文档说明,backgroundView始终处于cell的最下层,所以,将cell里的其它subview背景设为[UIColor clearColor],以cell.backgroundView作为统一的背景,应该是最好的方式。


UIView *view = [[UIView alloc] init];
        view.backgroundColor = [UIColor redColor];
        cell.backgroundView = view;

但是小编在Xcode7.3的时候,试了一下,好像可以直接设置cell.backgroundColor也有用,其实在Xcode5之前是必须要这样设置的

8.仅仅只隐藏第一级导航栏,这个基础上,第二级的导航栏不要隐藏

8192f8f6086422f49ce62a2b3fcbf532.jpg

Untitle.gif


- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillDisappear:animated];
}

9.修改状态栏为白色

在iOS9.0之前要通过这样设置

0f5ac8f23121aa84ae6c9da6a537272a.png

CBD985D7-5BB2-46EC-BE9A-1193EAEC5D47.png


然后在AppDelegate.m中加上一句代码


e5aad815d09ff2c292130f427fffa457.png

5B702A76-BA11-4288-87A7-BD167C4097E0.png


这里会警告是因为我这里是iOS9.3了.估计在iOS10之后这个方法就废弃了,

但是很值得注意的是如果你使用点语法却不会出现警告

db9eba232831e74d27177b07fef072a9.png

Snip20160823_11.png


然后在AppDelegate.m中加上一句代码


04579a676f3722bc18db866547d6f4eb.png

Snip20160823_10.png


现在是使用的是这个方法


-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

10.启动页面时候,状态栏隐藏

只需要在info.plist中设置一下就可以了,同时,别忘记了在AppDelegate.m中加一句代码

第一步:

2f62e39307149a440e1bcada6a25c15d.png

Snip20160823_14.png


第二步:

4903473756a9ef7686f8d72a5ceafbac.png


Snip20160823_17.png

11.修改UILable的某部分字颜色


- (void)touchesEnded:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event
{
    [self editStringColor:self.label.text editStr:@"好" color:[UIColor blueColor]];
}
- (void)editStringColor:(NSString *)string editStr:(NSString *)editStr color:(UIColor *)color {
    // string为整体字符串, editStr为需要修改的字符串
    NSRange range = [string rangeOfString:editStr];
    NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:string];
    // 设置属性修改字体颜色UIColor与大小UIFont
    [attribute addAttributes:@{NSForegroundColorAttributeName:color} range:range];
    self.label.attributedText = attribute;
}

12.调整UITableView的那个分割线位置


tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

13.导航栏随着滑动时候就隐藏显示


self.navigationController.hidesBarsOnSwipe = YES;

效果图

56f6bcf3b764ca2bb109d6b0d92ec531.jpg


Untitle.gif

上面导航栏随着滑动就隐藏的方法。我们也可以自己通过代码实现


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat offsetY = scrollView.contentOffset.y + _tableView.contentInset.top;
    CGFloat panTranslationY = [scrollView.panGestureRecognizer translationInView:self.tableView].y;
    if (offsetY > 64) {
        if (panTranslationY > 0)
        {
            //下滑趋势,显示
            [self.navigationController setNavigationBarHidden:NO animated:YES];
        } else {
            //上滑趋势,隐藏
            [self.navigationController setNavigationBarHidden:YES animated:YES];
        }
    } else {
        [self.navigationController setNavigationBarHidden:NO animated:YES];
    }
}

63ebd931f5e19fc29ead9a192e45fa81.jpg

效果图


Untitle.gif

14.解决UITableViewcell分割线短了一小段的问题

默认情况是样的

1fa45c7802dca18933c1abc38da3b72d.png

Snip20160824_1.png


在控制器中加上下面这段代码


-(void)viewDidLayoutSubviews{
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
    }
    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])
    {
        [self.tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
    }
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)])
    {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero]; 
    }
}


Snip20160824_2.png

aceec1f5b14b76d9145e8ce4424fea43.png

15.UITableView的索引背景色


- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {      
  for(UIView *view in [tv subviews])  
  {  
    if([[[view class] description] isEqualToString:@"UITableViewIndex"])  
    {  
      [view setBackgroundColor:[UIColor whiteColor]];  
      [view setFont:[UIFont systemFontOfSize:14]];  
    }  
  }  
  //rest of cellForRow handling...  
}

16:修改了系统自带头文件后,Xcode会报错,需要清除缓存


/Users/电脑名的用户名/资源库/Developer/Xcode/DerivedData
例如:/Users/kevindemac/Library/Developer/Xcode/DerivedData
这里要注意kevindemac就是Finder里面的个人
来到这个文件夹下:删除文件夹的缓存就👌

17:计算文字的宽度


NSString *string = @"哇哈哈";
    CGFloat stringWidth = [string sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}].width;
    NSLog(@"%f",stringWidth);
总结:CGFloat titleW = [字符串 sizeWithAttributes:@{NSFontAttributeName : 字体大小}].width;

18:文字内容换行


- 如何让storyboard\xib中的文字内容换行
    - 快捷键: option + 回车键:也就是你键盘上的Ctrl
    - 在storyboard\xib输入\n是无法实现换行的
- 在代码中输入\n是可以实现换行的

19:有透明度的颜色


[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.2];
[UIColor colorWithWhite:1.0 alpha:0.2];
[[UIColor whiteColor] colorWithAlphaComponent:0.2];

20:解决tableView出现多余行的问题

比如出现这种情况:


self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

21:UIimageView的创建问题


//第一种创建方式:图片本身是多大创建出来的图片就是多大
  UIImageView *image1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"friendTrends_icon"]];
    image1.center = CGPointMake(100, 100);
    [self.view addSubview:image1];
 //第二种创建方式:给定图片尺寸是多大创建出来就是多大,这样图片就可能会拉伸
    UIImageView *image2 = [[UIImageView alloc] init];
    image2.frame = CGRectMake(100, 100, 30, 30);
    image2.image = [UIImage imageNamed:@"friendTrends_icon"];
    [self.view addSubview:image2];

22:按钮大小和图片大小一致( 这个前提是自己添加了那个分类才可以直接拿到size)


btn.LYW_size = [UIImage imageNamed:@"MainTagSubIcon"].size;
   btn.LYW_size = [btn imageForState:UIControlStateNormal].size;
   btn.LYW_size = btn.currentImage.size;
   [btn sizeToFit];

23:json 字符串

我们在使用post时候不一定就是简单的字典,比如这种就是json字符串


{
    "token": "0831E5A2E4734AFDB90972CC0E0AEE83" ,
    "authItemInfo":{
                    "itemId": "17",////认证项目
                            //********手机认证      
                    "cellNumber": "18620300073", //手机号
                    "cellPassword": "831104",//服务密码
                            //京东认证
                    "jdAccount": " jdAccount",//京东账号
                    "jdPassword": "jdPassword", //京东密码
                    "captcha": "captcha",//网站短信验证码(根据流程码process_code动态输入)
                    "queryPwd": "queryPwd", //查询密码(仅北京移动会出现,官网的客服密码,根据流程码process_code动态输入)
                                        //******学历认证
                    "chsiAccount": " chsiAccount",//学信网账号
                    "chsiPassword": "chsiPassword",//学信网密码
                                    //****身份证,工作证明
                    "authFiles": [
                        {
                            "fileType": 1,
                            "fileName": "/data/uploads/cert/2016/07/21/15/97de1236421531f37ceed4a4b1767b5c.jpg"
                        },
                        {
                            "fileType": 1,
                            "fileName": "/data/uploads/cert/2016/07/21/15/eb41c0c14ae28bc76a34b823fe6dc962.jpg"
                        },
                        {
                            "fileType": 1,
                            "fileName": "/data/uploads/cert/2016/07/21/15/e9e85f991d6fc24743147b7e45f37035.jpg"
                        }
                    ]
                }
            }

需要这样转换后上传


NSString *url = [NSString stringWithFormat:@"%@/saveAuthItem",SDLOAN_URL];
        NSDictionary *dictPlace =@{@"itemId":@"7",
                                   @"authFiles":@[                                           @{@"fileName":_aliIDCardOne,@"fileType":@"1",@"position":@(1)},
                                     @{@"fileName":_aliIDCardTwo,@"fileType":@"1",@"position":@(2)}]};
    NSError *errors;
        NSData *jsonDatas = [NSJSONSerialization dataWithJSONObject:dictPlace options:NSJSONWritingPrettyPrinted error:&errors];
        NSString *jsonStrings = [[NSString alloc] initWithData:jsonDatas encoding:NSUTF8StringEncoding];
        NSDictionary *params = @{@"token":Token,@"authItemInfo":jsonStrings};

或者如果导入了MJExtension的话,可以这样转


NSString *json = dictPlace.mj_JSONString;

另外自己可以写两个方法去转JSON字符串


//数组转JSON字符串
+ (NSString *)arrayToJSONString:(NSArray *)array
{
   NSError *error = nil;
   //    NSMutableArray *muArray = [NSMutableArray array];
   //    for (NSString *userId in array) {
   //        [muArray addObject:[NSString stringWithFormat:@"\"%@\"", userId]];
   //    }
   NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error];
   NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
   //    NSString *jsonTemp = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
   //    NSString *jsonResult = [jsonTemp stringByReplacingOccurrencesOfString:@" " withString:@""];
   //    NSLog(@"json array is: %@", jsonResult);
   return jsonString;
}
//字典转JSON字符串
+ (NSString *)dictionaryToJSONString:(NSDictionary *)dictionary
{
   NSError *error = nil;
   NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
   NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
   //    NSString *jsonTemp = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
   //    NSString *jsonResult = [jsonTemp stringByReplacingOccurrencesOfString:@" " withString:@""];
   return jsonString;
}

24:复制


UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
    pasteBoard.string = @"1234567890";

25.TableView的自适应高度


#注意,这两行代码是TableView的自适应高度
        _tableView.estimatedRowHeight = 100;
        _tableView.rowHeight = UITableViewAutomaticDimension;

26:


一个#号在宏中的定义是“ ”双引号
两个#号的意思是拼接

27:


CFBundleShortVersionString 标识应用程序的发布版本号。这个版本号是由三个时期分割的整数组成的字符串。第一个整数代表重大修改的版本,例如实现新的功能或重大变化的修订;第二个整数表示修订,实现较突出的特点;第三个整数代表维护版本。该键的值不同于“CFBundleVersion”标识。
CFBundleVersion 标识内部版本号,可以是发布了的,也可以是还未发布的。这是一个单调增加的字符串,包括一个或多个时期分隔的整数。

28:调整UILable行间距


NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:label.text];    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setLineSpacing:20];
    [attrString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, label.text.length)];    label.attributedText = attrString;

28:调用调用UIImagePickerController显示中文英文的问题

81786ea361802b35435c0e5a3688c6c3.png

调用UIImagePickerController.png

29:图片和字符串之间的转换


//图片转字符串
+ (NSString *)UIImageToBase64Str:(UIImage *) image
{
    NSData *data = UIImageJPEGRepresentation(image, 5.0f);
    NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return encodedImageStr;
}
//字符串转图片
+ (UIImage *)Base64StrToUIImage:(NSString *)_encodedImageStr
{
    NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:_encodedImageStr];
    UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];
    return _decodedImage;
}

类似安卓提示消息


+ (void)showMessage:(NSString *)message
{
    UIWindow * window = [UIApplication sharedApplication].keyWindow;
    UIView *showview =  [[UIView alloc]init];
    showview.backgroundColor = [UIColor blackColor];
    showview.frame = CGRectMake(1, 1, 1, 1);
    showview.alpha = 1.0f;
    showview.layer.cornerRadius = 5.0f;
    showview.layer.masksToBounds = YES;
    [window addSubview:showview];
    UILabel *label = [[UILabel alloc]init];
    CGSize LabelSize = [message sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(320, 9000)];
    label.frame = CGRectMake(10, 5, LabelSize.width, LabelSize.height);
    label.text = message;
    label.textColor = [UIColor whiteColor];
    label.textAlignment = 1;
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:15];
    [showview addSubview:label];
    showview.frame = CGRectMake((LYWScreenWidth - LabelSize.width - 20)/2, LYWScreenHeight - 100, LabelSize.width+20, LabelSize.height+10);
    [UIView animateWithDuration:3 animations:^{
        showview.alpha = 0;
    } completion:^(BOOL finished) {
        [showview removeFromSuperview];
    }];
}

判断字符串为空


+ (BOOL)isBlankString:(NSString *)string
{
    if (string == nil || string == NULL)
    {
        return YES;
    }
    if ([string isKindOfClass:[NSNull class]])
    {
        return YES;
    }
    if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0)
    {
        return YES;
    }
    return NO;
}

检测代码量

用命令行 先进入cd  项目 再输入以下代码


find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.h" -or -name "*.rss" ")" -print | xargs wc -l

或者使用GitHub 上别人写的一个东西


https://github.com/976971956/DEMOlineNUM

改变 UITextField 占位文字 颜色


[_userName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

禁止横屏 在Appdelegate 使用


- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  
{  
    return UIInterfaceOrientationMaskPortrait;  
}

修改状态栏颜色 (默认黑色,修改为白色)

1.在Info.plist中设置


UIViewControllerBasedStatusBarAppearance 为NO

在需要改变状态栏颜色的 AppDelegate中在 didFinishLaunchingWithOptions 方法中增加:


[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

如果需要在单个ViewController中添加,在ViewDidLoad方法中增加:


[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

模糊效果


UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *test = [[UIVisualEffectView alloc] initWithEffect:effect];
    test.frame = self.view.bounds;
    test.alpha = 0.5;
    [self.view addSubview:test];

前往设置


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

系统的分享


UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[@"1",@"2",@"3"] applicationActivities:nil];
    activityVC.view.backgroundColor = [UIColor clearColor];
    activityVC.excludedActivityTypes = @[UIActivityTypePrint,UIActivityTypeAssignToContact,UIActivityTypeAddToReadingList,UIActivityTypeAirDrop];
    [self presentViewController:activityVC animated:YES completion:nil];

抓包


http://www.jianshu.com/p/5539599c7a25

手机运营商


-(void)getcarrierName{
    CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *carrier = [telephonyInfo subscriberCellularProvider];
    NSString *currentCountry=[carrier carrierName];
    NSLog(@"[carrier isoCountryCode]==%@,[carrier allowsVOIP]=%d,[carrier mobileCountryCode=%@,[carrier mobileCountryCode]=%@",[carrier isoCountryCode],[carrier allowsVOIP],[carrier mobileCountryCode],[carrier mobileNetworkCode]);
    NSLog(@"运营商:%@",currentCountry);
}

url中带中文


// UIWebView加载不出后台返回的url地址。是因为url中带有中文的原因,需要解码。
NSCharacterSet *set = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodedString = [self.url stringByAddingPercentEncodingWithAllowedCharacters:set];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:encodedString]]];


1.获取identifierForVendor标示手机
    NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];
http://blog.csdn.net/u014220518/article/details/50509559


Xcode编译报错: 
This application’s application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.
原因:两次编译的用的证书不一致。

数组去除相同元素


NSArray *dataArray = @[@"1",@"1",@"2",@"3",@"4",@"1"];
    NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:dataArray.count];
    // 外层一个循环
    for (NSString *item in dataArray) {
        // 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历
        // 时间复杂度为O ( n^2 )而不是O (n)
        if (![resultArray containsObject:item]) {
            [resultArray addObject:item];
        }
    }
    NSLog(@"resultArray: %@", resultArray);

数组的四种遍历方式


/// 以数组为例 实现下面4种遍历
    NSArray *array = @[@"1", @"2", @"3"];
    /// 遍历方式1 常规for循环
    for (NSInteger i = 0; i < [array count]; i++) {
        NSLog(@"%@", array[I]);
    }
    /// 遍历方式2 Objective-C 1.0 的NSEnumerator
    NSEnumerator *enu = [array objectEnumerator];
    id next = nil;
    while ((next = enu.nextObject) != nil) {
        // 当next为nil时 遍历结束
        NSLog(@"%@", next);
    }
    /// 遍历方式3 Objective-C 2.0 引入的for-in
    for (id obj in array) {
        NSLog(@"%@", obj);
    }
    /// 遍历方式4 最新的块遍历
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        // stop为YES时 结束遍历
        if (*stop == NO) {
            NSLog(@"%@", obj);
        }
    }];

cell的点击颜色


- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
//        [self setupView];
        [self setupCustomCellSelectedColor];
    }
    return self;
}
- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
    [self setupCustomCellSelectedColor];
}
调用该方法
- (void)setupCustomCellSelectedColor
{
    CGRect rect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    //高亮颜色值
    UIColor *selectedColor = [UIColor redColor];
    CGContextSetFillColorWithColor(context, [selectedColor CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    self.selectedBackgroundView = [[UIImageView alloc] initWithImage:image];
}

[iOS 11 UIScrollView的新特性(automaticallyAdjustsScrollViewInsets 不起作用了)]

解决方法


if (@available(iOS 11.0, *)) {
        _scroll.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }

swift自定义Log


func LYWLog<T>(_ message:T,file:String = #file,funcName:String = #function,lineNum:Int=#line)  {
    let fileName = (file as NSString).lastPathComponent
    print("\(fileName):[\(funcName)](\(lineNum)-\(message))")
}

Error returned in reply: Connection invalid


解决方法:把Xcode 以及模拟器全部关掉 从新启动一个Xcode就好了


ERROR ITMS-90096: "Your binary is not optimized for iPhone 5 - New iPhone apps and app updates submitted must support the 4-inch display on iPhone 5 and must include a launch image referenced in the Info.plist under UILaunchImages with a UILaunchImageSize value set to {320, 568}. Launch images must be PNG files and located at the top-level of your bundle, or provided within each .lproj folder if you localize your launch images. Learn more about iPhone 5 support and app launch images by reviewing the 'iOS Human Interface Guidelines' at https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen."

特么的要是遇到这个问题,别特么听网上一大堆的解决方案,说白了就是你的启动图片不对。要么启动图片的尺寸不对,要么就是图片中不是png的图片。

关于移动硬盘无法修改资料的问题


http://www.pc6.com/mac/117369.html

图片设置圆角

//cornerRadius 设置为self.iconImage图片宽度的一半(圆形图片)


self.iconImage.layer.cornerRadius = 20;
    self.iconImage.layer.masksToBounds = YES;

在此之后建议大家尽量不要这么设置, 因为使用图层过量会有卡顿现象, 特别是弄圆角或者阴影会很卡, 如果设置图片圆角我们一般用绘图来做:


- (UIImage *)cutCircleImage {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
    // 获取上下文
    CGContextRef ctr = UIGraphicsGetCurrentContext();
    // 设置圆形
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(ctr, rect);
    // 裁剪
    CGContextClip(ctr);
    // 将图片画上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

UILable修改行距


1.UILabel修改文字行距,首行缩进
lineSpacing: 行间距
firstLineHeadIndent:首行缩进
font: 字体
textColor: 字体颜色
- (NSDictionary *)settingAttributesWithLineSpacing:(CGFloat)lineSpacing FirstLineHeadIndent:(CGFloat)firstLineHeadIndent Font:(UIFont *)font TextColor:(UIColor *)textColor{
    //分段样式
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    //行间距
    paragraphStyle.lineSpacing = lineSpacing;
    //首行缩进
    paragraphStyle.firstLineHeadIndent = firstLineHeadIndent;
    //富文本样式
    NSDictionary *attributeDic = @{
                                   NSFontAttributeName : font,
                                   NSParagraphStyleAttributeName : paragraphStyle,
                                   NSForegroundColorAttributeName : textColor
                                   };
    return attributeDic;
}

判断是否为gif/png图片的正确姿势

//假设这是一个网络获取的URL


NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif";
   // 判断是否为gif
   NSString *extensionName = path.pathExtension;
    if ([extensionName.lowercaseString isEqualToString:@"gif"]) {
        //是gif图片
    } else {
        //不是gif图片
    }

以上判断看似是可以的,但是这不严谨的, 在不知道图片扩展名的情况下, 如何知道图片的真实类型 ? 其实就是取出图片数据的第一个字节, 就可以判断出图片的真实类型那该怎么做呢如下:


//通过图片Data数据第一个字节 来获取图片扩展名
- (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return @"jpeg";
        case 0x89:
            return @"png";     
        case 0x47:
            return @"gif";        
        case 0x49:   
        case 0x4D:
            return @"tiff";        
        case 0x52:  
            if ([data length] < 12) {
                return nil;
            }
            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return @"webp";
            }
            return nil;
    }
    return nil;
}

使用 IQKeyboardManager如果你的视图有导航栏,你不想上移View时,UINavigationBar消失,你也可以进行相应设置:

如果你使用的是代码,你就需要覆盖UIViewController中的'-(void)loadView' 方法:


##添加额外代码,避免导航栏
  UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.scrollEnabled = YES;
    [self.view addSubview:scrollView];
  #scroll.scrollEnabled = NO
如果你使用的是storyboard or xib,只需将当前视图视图控制器中的UIView class变为UIScrollView。

9d4043ca0498f47fc1e31a8094e1601c.png                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

image.png

相关文章
|
6月前
|
存储 数据建模 iOS开发
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
100 1
|
6月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
75 0
|
监控 Android开发 iOS开发
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
参考代码:弹性扩缩容如何实现?System.out.println("扩容:增加直播平台实例"); currentCapacity++; } private void scaleDown() { System.out.println("缩容:减少直播平台实例");
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
|
移动开发 安全 前端开发
提升iOS应用安全性:全面代码混淆功能介绍,使用Ipa Guard保护你的应用
iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过修改 ipa 文件中的 macho 文件中二进制数据(代码模块配置)进行操作,无需源码。不限定开发技术平台。支持oc,swift,cocos2d-x、unity3d、quick-cocos,html5 ,react native等等各种开发技术。Ipa Guard主要包含代码混淆全面、资源文件处理、不需要源代码更安全、调试信息清理、即时测试运行。
|
移动开发 前端开发 iOS开发
记录一下前端H5的复制功能在ios端的兼容性问题
记录一下前端H5的复制功能在ios端的兼容性问题
987 0
|
27天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
49 3
|
4月前
|
人工智能 搜索推荐 iOS开发
苹果发布iOS 18 Beta 4,新增CarPlay 壁纸等多项功能改进
本文首发于公众号“AntDream”,探索iOS 18 Beta 4新功能与改进: CarPlay壁纸、iCloud设置访问优化、相机控制记忆、隐藏文件夹设计变更、深色/浅色模式图标同步、股票应用图标调整、iPhone镜像功能增强、控制中心蓝牙切换键、AssistiveTouch新增Type to Siri等,以及Apple Intelligence暗示。开发者可通过苹果计划提前体验。
103 12
|
6月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
282 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
182 0