iOS 总结

作者: 小傑 | 来源:发表于2016-08-27 17:42 被阅读882次

    1,打印View所有子视图

    po [[self view]recursiveDescription]
    

    2.阿拉伯数字转汉字(1转一)

    原值:2.7999999999
    typedef CF_ENUM(CFIndex, CFNumberFormatterRoundingMode) {
        kCFNumberFormatterRoundCeiling = 0,//四舍五入,直接输出3
        kCFNumberFormatterRoundFloor = 1,//保留小数输出2.8
        kCFNumberFormatterRoundDown = 2,//加上了人民币标志,原值输出¥2.8
        kCFNumberFormatterRoundUp = 3,//本身数值乘以100后用百分号表示,输出280%
        kCFNumberFormatterRoundHalfEven = 4,//输出2.799999999E0
        kCFNumberFormatterRoundHalfDown = 5,//原值的中文表示,输出二点七九九九。。。。
        kCFNumberFormatterRoundHalfUp = 6//原值中文表示,输出第三
    };
    
    
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = kCFNumberFormatterRoundHalfDown;
    NSString *string = [formatter stringFromNumber:[NSNumber numberWithInt:12]];
    NSLog(@"str = %@", string);
    
    //阿拉伯数字转中文格式
    +(NSString *)translation:(NSString *)arebic
    {
        NSString *str = arebic;
        NSArray *arabic_numerals = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0"];
        NSArray *chinese_numerals = @[@"一",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"零"];
        NSArray *digits = @[@"个",@"十",@"百",@"千",@"万",@"十",@"百",@"千",@"亿",@"十",@"百",@"千",@"兆"];
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:chinese_numerals forKeys:arabic_numerals];
        
        NSMutableArray *sums = [NSMutableArray array];
        for (int i = 0; i < str.length; i ++) {
            NSString *substr = [str substringWithRange:NSMakeRange(i, 1)];
            NSString *a = [dictionary objectForKey:substr];
            NSString *b = digits[str.length -i-1];
            NSString *sum = [a stringByAppendingString:b];
            if ([a isEqualToString:chinese_numerals[9]])
            {
                if([b isEqualToString:digits[4]] || [b isEqualToString:digits[8]])
                {
                    sum = b;
                    if ([[sums lastObject] isEqualToString:chinese_numerals[9]])
                    {
                        [sums removeLastObject];
                    }
                }else
                {
                    sum = chinese_numerals[9];
                }
                
                if ([[sums lastObject] isEqualToString:sum])
                {
                    continue;
                }
            }
            
            [sums addObject:sum];
        }
        
        NSString *sumStr = [sums componentsJoinedByString:@""];
        NSString *chinese = [sumStr substringToIndex:sumStr.length-1];
        NSLog(@"%@",str);
        NSLog(@"%@",chinese);
        return chinese;
    }
    

    3.app内启动用户评价

    //app内启动用户评价
    NSString *url = [NSString stringWithFormat:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d",490062954];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
    490062954是程序的Apple ID,可以在iTunes Connect中查到。
    比如在用户使用一段时间后,弹出一个对话框提醒用户去评价:
    
    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"去给'%@'打分吧!",appName]
                                                        message:@"您的评价对我们很重要"
                                                       delegate:self
                                              cancelButtonTitle:nil
                                              otherButtonTitles:@"稍后评价",@"去评价",nil];
    [alertView show];
    
    
    
    软件版本: NSString *appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
    
    //iOS跳转到App Store下载应用评分
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APPID"]];
    

    4.字典->模型 模型->字典

    //这是使用系统的方法 descriptionDe 代替 description(不使用MJ)
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key
    {
        if ([key isEqualToString:@"description"]) {
            self.descriptionDe = value;
        }
    }
    
    1. JSON -> Model【最简单的字典转模型】
    // JSON -> User
    User *user = [User mj_objectWithKeyValues:dict];
    
    2.JSONString -> Model【JSON字符串转模型】
    // 1.Define a JSONString
    NSString *jsonString = @"{\"name\":\"Jack\", \"icon\":\"lufy.png\", \"age\":20}";
    
    // 2.JSONString -> User
    User *user = [User mj_objectWithKeyValues:jsonString];
    
    3.模型中的属性名和字典中的key不相同(用ID代替id,后面类似)
    [Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
        return @{
                 @"ID" : @"id",
                 @"desc" : @"desciption",
                 @"oldName" : @"name.oldName",
                 @"nowName" : @"name.newName",
                 @"nameChangedTime" : @"name.info[1].nameChangedTime",
                 @"bag" : @"other.bag"
                 };
    }];
    
    4.JSON array -> model array【将一个字典数组转成模型数组】
    
    NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
    
    #pragma mark -模型->字典
    5.Model -> JSON【将一个模型转成字典】
    
    Status *status = [[Status alloc] init];
    NSDictionary *statusDict = status.mj_keyValues;
    
    6. Model array -> JSON array【将一个模型数组转成字典数组】
    
    NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
    
    7.转化为JSONNString
    
    [dict mj_JSONNString]
    

    5.关于push,pop,model,dimiss

    遍历popToViewController跳转的控制器,然后跳到指定位置
    for (int i = 0; i<self.navigationController.viewControllers.count; i++) {
        
        UIViewController * controller = self.navigationController.viewControllers[i];
        
        if ([controller isKindOfClass:InformMainViewController.class]) {
            
            InformMainViewController * vc = (InformMainViewController *)controller;
            
            [self.navigationController popToViewController:vc animated:YES];
            
            break;
            
        }
    }
    
    pop回指定控制器
    
    1. NSArray *viewControllers=[self.navigationController viewControllers];
    2. UIViewController *controller=[viewControllers objectAtIndex:1];
    3. [self.navigationController popToViewController:controller animated:YES];
    
    
    3.关于push,pop,model,dimiss
       1.注意�:如果用stroyboard的话,要拉线,不然可能会出现不了界面!!!
    [self performSegueWithIdentifier:@"MyApply-To-FlowDetail" sender:nil];
    //跳转前传值
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"MyApply-To-FlowDetail"]) {
            FlowDetailController * controller = segue.destinationViewController;
            if (_bool_fromApply) {
                controller.flow_id = _flow_id;
            }
            else
            {
                controller.flow_id = _flowInfoModel.id;
            }
            controller.delegate = self;
        }
    }
       2.第二种方法
    UIStoryboard *story = [UIStoryboard storyboardWithName:@"My" bundle:nil];
    MyEnterCompanyNameController *vc = (MyEnterCompanyNameController *)[story instantiateViewControllerWithIdentifier:@"MyEnterCompanyName"];
    
    [self.navigationController pushViewController:vc animated:YES];
    
    4.设置转场动画modalTransitionStyle
     
       1.系统的
    UIViewController *detailViewController = [[UIViewController alloc] init];
            detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;    // 设置动画效果
            [self presentModalViewController:detailViewController animated:YES];
    
       2.自定义的
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"My" bundle:nil];
            MyJoinCompanyController *vc = (MyJoinCompanyController *)[storyboard instantiateViewControllerWithIdentifier:@"MyJoinCompanyController"];
    CATransition *animation = [CATransition animation];
            [animation setDuration:0.5];
            [animation setType:kCATransitionPush];
            [animation setSubtype:kCATransitionFromRight];
            [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
            [[vc.view layer] addAnimation:animation forKey:@"pushToView"];
            [self presentViewController:vc animated:YES completion:nil];
    
    5.如果底部有tabbar的话,push要加上
    vc.hidesBottomBarWhenPushed = YES;
    
    6.如果拖拽手势返回的时候,右上角有黑色,加这句
    self.na
    

    6.关于通知,delegate

    1.delegate执行回调pop时,如果跨界面跳需要用NSNotificationCenter通知,(代理只能执行跳一个界面!!!!!),
      第2种方法是目标控制器.h中声明一种方法来调用
    

    7.判断app程序第一次启动方法

    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstStart"];
        NSLog(@"第一次启动");
    }else{
        NSLog(@"不是第一次启动");
    }
    

    8.透明度

    1.如果UIView B为半透明, 如何让加载上边的UIView C不透明?
    设置ViewB的半透明时使用B.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8]
    
    2. 有透明度的颜色
    [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];
    

    9.用这方法可以遮住导航栏

    [[UIApplication sharedApplication].keyWindow addSubview:self.view_shadow];
    

    10.关于NSLog

    1.点输出NSLog(@"point  = %@",NSStringFromCGPoint(self.tableView.contentOffset));
    

    11.NULL、nil、Nil这三者对于Objective-C中值是一样的,都是(void *)0,那么为什么要区分呢?又与NSNull之间有什么区别:

    NULL是宏,是对于C语言指针而使用的,表示空指针
    nil是宏,是对于Objective-C中的对象而使用的,表示对象为空
    Nil是宏,是对于Objective-C中的类而使用的,表示类指向空
    NSNull是类类型,是用于表示空的占位对象,与JS或者服务端的null类似的含意
    

    12.NSDate的比较

    NSDate *now = [[NSDate alloc] init];
    if ([self.btn_date.date compare:now] == NSOrderedDescending) {  // 前面的大于后面的
        
        
    }
    
    BOOL result = [a compare:b];
    if (result == NSOrderedSame) { // NSOrderedSame = 0 完全一样
        NSLog(@"a = b");
    }else if(result == NSOrderedAscending) // NSOrderedAscending = -1
    NSLog(@"a < b");
    else{ //NSOrderedDescending = +1
        NSLog(@"a > b");
    }
    

    13.关于Masonry

    1.更新可以用update 或者 remake(移除之前的所有约束,然后添加新约束的方法是:mas_remakeConstraints。)
    2.对于cell中需要添加删除变化cell位置的要用mas_remakeConstraints来设置约束,(因为它是添加约束与更新约束,不用会有问题!)
    
    3.设置多行labl!
    -(void)mostLineLabel
    {
        UILabel *label = [[UILabel alloc] init];
        label.font = [UIFont systemFontOfSize:17];
        label.text = @"Masonry是一个轻量级的布局框架与更好的包装AutoLayout语法。Masonry是一个轻量级的布局框架与更好的包装AutoLayout语法。asasadadadada";
        label.textColor = [UIColor blackColor];
        [self.view addSubview:label];
        label.numberOfLines = 0;
        
        //注意:这2句很重要
        label.preferredMaxLayoutWidth = ([UIScreen mainScreen].bounds.size.width -20);
        [label setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
        //注意:这里只是设置了它的宽度和位置,(没有设置高!!!!!)
        [label mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view).with.offset(10);
            make.right.mas_equalTo(self.view).with.offset(-10);
            make.top.mas_equalTo(self.view).with.offset(100);
        }];
    }
    4.当使用masonry自定义cell的时候,如果cell的子控件尺寸需要动态变化的话,必须使用remake
    

    14.layoutSubviews在以下情况下会被调用:

    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    

    15.点击屏幕得时候隐藏键盘,可以在这个方法里执行要隐藏或remove的view。

    1.
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        UITouch *touch=[[event allTouches] anyObject];
        if (touch.tapCount >=1) {
            [self.view endEditing:YES];
        }
    }
    2.你可以在任何地方加上这句话,可以用来统一收起键盘
    [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
    
    3.iOS在当前屏幕获取第一响应
    UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
    UIView * firstResponder = [keyWindow performSelector:@selector(firstResponder)];
    

    16.设置不自动黑屏

    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
    

    17.如何获取手机硬件信息?

    [[UIDevice currentDevice] systemName];
    [[UIDevice currentDevice] systemVersion];//os version
    [[UIDevice currentDevice] uniqueIdentifier];
    [[UIDevice currentDevice] model];
    [[UIDevice currentDevice] name];
    
    这样就实现了基本的使用,跟delegate类似,注意 addObserver时,需要写目标viewcontroller的实例,而不是self。
    

    18.ios如何实现推送通知

    http://blog.csdn.net/ios_che/article/details/7428413
    

    19.ios9关于http 与HTTPS

    在info.plist最后加上
    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    </dict>
    定位功能
    <key>NSLocationAlwaysUsageDescription</key>
    <string>LocationDemo</string>
    <key>UIBackgroundModes</key>
    <array>
    <string>location</string>
    </array>
    

    20.在iOS上present一个半透明的viewController

    (http://blog.csdn.net/jasonblog/article/details/17172969)
                                      
    1. viewController.view.backgroundColor = [UIColor clearColor];
    2. rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
    3. [rootViewController presentModalViewController:viewController animated:YES];
    4. 这里有两个点:一是设置modalPresentationStyle为UIModalPresentationCurrentContext,二是需要在rootViewController上操作。
    

    21.创建渐变色图层

     -(void)setGradientLayer2
    {
        // 创建渐变色图层
        CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.frame       = self.secView.bounds;
        
        gradientLayer.colors = @[
                                 (id)[UIColor cyanColor].CGColor,
                                 (id)[UIColor blueColor].CGColor,
                                 (id)[UIColor redColor].CGColor
                                 ];
        // 设置渐变方向(0~1)
        gradientLayer.startPoint = CGPointMake(0, 0);
        gradientLayer.endPoint = CGPointMake(0, 1);
        
        // 设置渐变色的起始位置和终止位置(颜色的分割点)
        gradientLayer.locations = @[@(0.05f),@(0.70f),@(0.25f)];
        gradientLayer.borderWidth  = 0.0;
        
        // 添加图层
        [self.secView.layer addSublayer:gradientLayer];
    }
    

    22.svn 无法上传.a文件

     去终端:cd 静态库所在的文件夹路径 按回车 svn add 你静态库的名字 .a也需要加上 然后回车
    

    23.设置center和size,要先设置size再设置center!!!

    24.让iOS应用直接退出

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

    25.获取 iOS 路径的方法

    1.获取家目录路径的函数
    NSString *homeDir = NSHomeDirectory();
    
    2.获取Documents目录路径的方法
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    
    3.获取Documents目录路径的方法
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesDir = [paths objectAtIndex:0];
    
    4.获取tmp目录路径的方法:
    NSString *tmpDir = NSTemporaryDirectory();
    

    26.修改Tabbar Item的属性

     // 修改标题位置
     self.tabBarItem.titlePositionAdjustment = UIOffsetMake(0, -10);
     // 修改图片位置
     self.tabBarItem.imageInsets = UIEdgeInsetsMake(-3, 0, 3, 0);
     
     // 批量修改属性
     for (UIBarItem *item in self.tabBarController.tabBar.items) {
         [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                       [UIFont fontWithName:@"Helvetica" size:19.0], NSFontAttributeName, nil]
                             forState:UIControlStateNormal];
     }
     
     // 设置选中和未选中字体颜色
     [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
     
     //未选中字体颜色
     [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} forState:UIControlStateNormal];
     
     //选中字体颜色
     [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor cyanColor]} forState:UIControlStateSelected];
    

    27.UIAlertController

     UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
     
     [controller addAction:[UIAlertAction actionWithTitle:@"收藏" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"点击了[收藏]按钮");
    }]];
     
     [controller addAction:[UIAlertAction actionWithTitle:@"举报" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"点击了[举报]按钮");
    }]];
     
     [controller addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"点击了[取消]按钮");
    }]];
     
     //    [controller addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
     //        textField.textColor = [UIColor redColor];
     //    }];
     
     [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
    

    28.控件的局部圆角问题

     1.
     CGRect rect = CGRectMake(0, 0, 100, 50);
     CGSize radio = CGSizeMake(5, 5);//圆角尺寸
     UIRectCorner corner = UIRectCornerTopLeft|UIRectCornerTopRight;//这只圆角位置
     UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corner cornerRadii:radio];
     CAShapeLayer *masklayer = [[CAShapeLayer alloc]init];//创建shapelayer
     masklayer.frame = button.bounds;
     masklayer.path = path.CGPath;//设置路径
     button.layer.mask = masklayer;
     
     //2.设置cell为圆角
     - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([cell respondsToSelector:@selector(tintColor)]) {
            if (tableView == self.tableView) {
                // 圆角弧度半径
                CGFloat cornerRadius = 20.f;
                // 设置cell的背景色为透明,如果不设置这个的话,则原来的背景色不会被覆盖
                cell.backgroundColor = UIColor.clearColor;
                
                // 创建一个shapeLayer
                CAShapeLayer *layer = [[CAShapeLayer alloc] init];
                CAShapeLayer *backgroundLayer = [[CAShapeLayer alloc] init]; //显示选中
                // 创建一个可变的图像Path句柄,该路径用于保存绘图信息
                CGMutablePathRef pathRef = CGPathCreateMutable();
                // 获取cell的size
                CGRect bounds = CGRectInset(cell.bounds, 0, 0);
                
                // CGRectGetMinY:返回对象顶点坐标
                // CGRectGetMaxY:返回对象底点坐标
                // CGRectGetMinX:返回对象左边缘坐标
                // CGRectGetMaxX:返回对象右边缘坐标
                
                // 这里要判断分组列表中的第一行,每组section的第一行,每组section的中间行
                BOOL addLine = NO;
                // CGPathAddRoundedRect(pathRef, nil, bounds, cornerRadius, cornerRadius);
                
                NSInteger num = [tableView numberOfRowsInSection:indexPath.section];
                if (num == 1) {//1.当这组只有一行的时候,4个角读要是圆角
                    
                    
                    // 初始起点为cell的左下角坐标
                    CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
                    // 起始坐标为左下角,设为p1,(CGRectGetMinX(bounds), CGRectGetMinY(bounds))为左上角的点,设为p1(x1,y1),(CGRectGetMidX(bounds), CGRectGetMinY(bounds))为顶部中点的点,设为p2(x2,y2)。然后连接p1和p2为一条直线l1,连接初始点p到p1成一条直线l,则在两条直线相交处绘制弧度为r的圆角。
                    
                    //1.左下角为起点p,左上角为p1,顶部中点为p2,然后连接p1和p2为一条直线l1,连接初始点p到p1成一条直线l,则在两条直线相交处绘制弧度为r的圆角。
                    CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
                    //2.顶部中点为p2,右上角为p3,右边中点为p4,连接p2p3与p3p4则在两条直线相交处绘制弧度为r的圆角。
                    CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                    CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
                    CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMinX(bounds), CGRectGetMidY(bounds), cornerRadius);
                    
                }else//2.这组不止1行
                {
                    if (indexPath.row == 0) {
                        // 初始起点为cell的左下角坐标
                        CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
                        // 起始坐标为左下角,设为p1,(CGRectGetMinX(bounds), CGRectGetMinY(bounds))为左上角的点,设为p1(x1,y1),(CGRectGetMidX(bounds), CGRectGetMinY(bounds))为顶部中点的点,设为p2(x2,y2)。然后连接p1和p2为一条直线l1,连接初始点p到p1成一条直线l,则在两条直线相交处绘制弧度为r的圆角。
                        CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
                        CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                        // 终点坐标为右下角坐标点,把绘图信息都放到路径中去,根据这些路径就构成了一块区域了
                        CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
                        addLine = YES;
                    } else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
                        // 初始起点为cell的左上角坐标
                        CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
                        CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
                        CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                        // 添加一条直线,终点坐标为右下角坐标点并放到路径中去
                        CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
                    } else {
                        // 添加cell的rectangle信息到path中(不包括圆角)
                        CGPathAddRect(pathRef, nil, bounds);
                        addLine = YES;
                    }
                    
                }
                
                //            if (indexPath.row == 0) {
                //                // 初始起点为cell的左下角坐标
                //                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
                //                // 起始坐标为左下角,设为p1,(CGRectGetMinX(bounds), CGRectGetMinY(bounds))为左上角的点,设为p1(x1,y1),(CGRectGetMidX(bounds), CGRectGetMinY(bounds))为顶部中点的点,设为p2(x2,y2)。然后连接p1和p2为一条直线l1,连接初始点p到p1成一条直线l,则在两条直线相交处绘制弧度为r的圆角。
                //                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds), CGRectGetMidX(bounds), CGRectGetMinY(bounds), cornerRadius);
                //                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                //                // 终点坐标为右下角坐标点,把绘图信息都放到路径中去,根据这些路径就构成了一块区域了
                //                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds));
                //                addLine = YES;
                //            } else if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1) {
                //                // 初始起点为cell的左上角坐标
                //                CGPathMoveToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
                //                CGPathAddArcToPoint(pathRef, nil, CGRectGetMinX(bounds), CGRectGetMaxY(bounds), CGRectGetMidX(bounds), CGRectGetMaxY(bounds), cornerRadius);
                //                CGPathAddArcToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMaxY(bounds), CGRectGetMaxX(bounds), CGRectGetMidY(bounds), cornerRadius);
                //                // 添加一条直线,终点坐标为右下角坐标点并放到路径中去
                //                CGPathAddLineToPoint(pathRef, nil, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
                //            } else {
                //                // 添加cell的rectangle信息到path中(不包括圆角)
                //                CGPathAddRect(pathRef, nil, bounds);
                //                addLine = YES;
                //            }
                
                
                // 把已经绘制好的可变图像路径赋值给图层,然后图层根据这图像path进行图像渲染render
                layer.path = pathRef;
                backgroundLayer.path = pathRef;
                // 注意:但凡通过Quartz2D中带有creat/copy/retain方法创建出来的值都必须要释放
                CFRelease(pathRef);
                // 按照shape layer的path填充颜色,类似于渲染render
                // layer.fillColor = [UIColor colorWithWhite:1.f alpha:0.8f].CGColor;
                layer.fillColor = [UIColor whiteColor].CGColor;
                // 添加分隔线图层
                if (addLine == YES) {
                    CALayer *lineLayer = [[CALayer alloc] init];
                    CGFloat lineHeight = (1.f / [UIScreen mainScreen].scale);
                    lineLayer.frame = CGRectMake(CGRectGetMinX(bounds), bounds.size.height-lineHeight, bounds.size.width, lineHeight);
                    // 分隔线颜色取自于原来tableview的分隔线颜色
                    lineLayer.backgroundColor = tableView.separatorColor.CGColor;
                    [layer addSublayer:lineLayer];
                }
                
                // view大小与cell一致
                UIView *roundView = [[UIView alloc] initWithFrame:bounds];
                // 添加自定义圆角后的图层到roundView中
                [roundView.layer insertSublayer:layer atIndex:0];
                roundView.backgroundColor = UIColor.clearColor;
                //cell的背景view
                //cell.selectedBackgroundView = roundView;
                cell.backgroundView = roundView;
                
                //以上方法存在缺陷当点击cell时还是出现cell方形效果,因此还需要添加以下方法
                UIView *selectedBackgroundView = [[UIView alloc] initWithFrame:bounds];
                backgroundLayer.fillColor = tableView.separatorColor.CGColor;
                [selectedBackgroundView.layer insertSublayer:backgroundLayer atIndex:0];
                selectedBackgroundView.backgroundColor = UIColor.clearColor;
                cell.selectedBackgroundView = selectedBackgroundView;
            }
        }
    }
    

    29.添加毛玻璃效果

     - (void)setupBlur
    {
        // 1.初始化toolBar
        UIToolbar *toolBar = [[UIToolbar alloc] init];
        [self.image addSubview:toolBar];
        toolBar.barStyle = UIBarStyleBlack;
        
        // 2.添加约束
        toolBar.translatesAutoresizingMaskIntoConstraints = NO;
        [toolBar mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self.image);
        }];
    }
     
     
     2.
     UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
     imageView.image = [UIImage imageNamed:@"肚肚.jpg"];
     
    /*注:尽量避免将UIVisualEffectView对象的alpha值设置为小于1.0的值,
        因为创建半透明的视图会导致系统在离屏渲染时去对UIVisualEffectView对象
         及所有的相关的子视图做混合操作。这不但消耗CPU/GPU,也可能会导致许多效果
         显示不正确或者根本不显示。*/
     UIVisualEffectView *view = [[UIVisualEffectView alloc]initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];
     view.frame = CGRectMake(20, 20, CGRectGetWidth(self.view.frame)-40,  CGRectGetHeight(self.view.frame)-40);
     view.layer.cornerRadius = 5;
     view.clipsToBounds = YES;
     
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, CGRectGetWidth(self.view.frame) - 10, 45)];
     label.text = @"fucking high";
     
     [self.view addSubview:imageView];
     [view.contentView addSubview:label];
     [self.view addSubview:view];
    

    30.修改名字

    点击名字,右键,refactor,rename
    

    31.pch文件

    1.修改路径 build setting,apple LLVM 7.0 -Language,Prefix Header
      使用路径:067/PrefixHeader.pch(相对路径)
      全路径:/Users/bona/Desktop/IOS素材/模板/总结/搜索search/067/067/PrefixHeader.pch
    2.格式
    #ifdef __OBJC__  //在这里定义
    
    #define ScreenHeight [[UIScreen mainScreen] bounds].size.height
    
    #endif
    

    32.两种方法删除NSUserDefaults所有记录

    //方法一
    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
    
    
    //方法二
    - (void)resetDefaults
    {
        NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
        NSDictionary * dict = [defs dictionaryRepresentation];
        for (id key in dict)
        {
            [defs removeObjectForKey:key];
        }
        [defs synchronize];
    }
    

    33.iOS 获取汉字的拼音

    + (NSString *)transform:(NSString *)chinese
    {
        //将NSString装换成NSMutableString
        NSMutableString *pinyin = [chinese mutableCopy];
        //将汉字转换为拼音(带音标)
        CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);
        NSLog(@"%@", pinyin);
        //去掉拼音的音标
        CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
        NSLog(@"%@", pinyin);
        //返回最近结果
        return pinyin;
    }
    

    34.手动更改iOS状态栏的颜色

    - (void)setStatusBarBackgroundColor:(UIColor *)color
    {
        UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
        
        if ([statusBar respondsToSelector:@selector(setBackgroundColor:)])
        {
            statusBar.backgroundColor = color;
        }
    }
    
    2.[self setNeedsStatusBarAppearanceUpdate];
    
    3.修改statusbar文字颜色
        1.要修改为白色的需要在infoPlist里设置UIViewControllerBasedStatusBarAppearance为NO
        2.[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    
    4.iOS加载启动图的时候隐藏statusbar    只需需要在info.plist中加入Status bar is initially hidden 设置为YES就好
    

    35.取消UICollectionView的隐式动画

    UICollectionView在reloadItems的时候,默认会附加一个隐式的fade动画,有时候很讨厌,尤其是当你的cell是复合cell的情况下(比如cell使用到了UIStackView)。
    下面几种方法都可以帮你去除这些动画
    
    
    //方法一
    [UIView performWithoutAnimation:^{
        [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    }];
    
    //方法二
    [UIView animateWithDuration:0 animations:^{
        [collectionView performBatchUpdates:^{
            [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
        } completion:nil];
    }];
    
    //方法三
    [UIView setAnimationsEnabled:NO];
    [self.trackPanel performBatchUpdates:^{
        [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    } completion:^(BOOL finished) {
        [UIView setAnimationsEnabled:YES];
    }];
    

    36.获取到webview的高度

    CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
    

    37.+ initialize 与 +load

    + initialize  这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量
    
    + load  方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法,它调用比main还早
    
    如果你实现了+ load 方法,那么当类被加载时它会自动被调用。这个调用非常早。如果你实现了一个应用或框架的 + load,并且你的应用链接到这个框架上了,那么 + load 会在 main() 函数之前被调用。如果你在一个可加载的 bundle 中实现了 + load,那么它会在 bundle 加载的过程中被调用。
    
    + initialize 方法的调用看起来会更合理,通常在它里面写代码比在 + load 里写更好。+ initialize 很有趣,因为它是懒调用的,也有可能完全不被调用。类第一次被加载时,
    
    + initialize 不会被调用。类接收消息时,运行时会先检查 + initialize 有没有被调用过。如果没有,会在消息被处理前调用。
    

    38.自动布局scrollview

    1.在scrollview上先加一个contentView
    2.设置它的布局
    [self. contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.mas_equalTo(self.scrollView);
            make.height.mas_equalTo(800);
        }];
    3.所有的子控件添加到contentView,并基于它来布局
    4.注意:如果没有设置contentView的宽,子控件right要基于self.view,不然会看不到,这是由于scrollview的contentSize的width不确定
    5. contentView的宽高决定了scrollview的contentSize的width和height
    

    39.编辑状态

    //1.成为第一响应者,叫起键盘
    [self.textView becomeFirstResponder];
    
    //2.放弃第一响应者,放下键盘
    [self.textView resignFirstResponder];
    
    //3.判断键盘是否弹起,是否在编辑状态
    self.textView.isFirstResponder == YES
    

    40.edgesForExtendedLayout

    在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll。当你的容器是navigation controller时,默认的布局将从navigation bar的顶部开始。这就是为什么所有的UI元素都往上漂移了44pt。
    
    self.edgesForExtendedLayout = UIRectEdgeNone;
    

    相关文章

      网友评论

        本文标题:iOS 总结

        本文链接:https://www.haomeiwen.com/subject/hsktettx.html