美文网首页
工作笔记

工作笔记

作者: koreadragon | 来源:发表于2017-02-14 12:02 被阅读56次

    积少成多,每天进步一点点,2016/5/10

    Xcode控制台字体为SF Mono

    1--xib约束自适应

    xib或者系统的cell局部空间需要自适应时,使用下面代码,将IB中的约束当做属性拖出来,然后利用以下语句动态给其赋值
    CGSize sizeFit = [self.primeCostLabel.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}];
    
    //动态计算测量
            CGSize sizeFit = [cell.nameLabel.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}];
            cell.nameLabelWidth.constant = sizeFit.width;
    

    2--通过点击的控件获取对应的cell的index

    例如每个cell上有个button,用以下方法:
    //    
    //    HGManageOrdersTableViewCell *cell = (HGManageOrdersTableViewCell * )[senderButton superview].superview;
    //    NSIndexPath *indexPath = [_myFirstTableView indexPathForCell:cell];
    //    NSLog(@"发货按钮对应index%ld",(long)indexPath.section); 
    

    3--给imageView添加手势

    imageView用户交互默认是关闭的,需手动打开
    
        cell.firstAddImageView.userInteractionEnabled = YES;
    

    4--iOS富文本(指定区间的文字变色,变字形等)

     NSMutableAttributedString *nowPrice = [[NSMutableAttributedString alloc]initWithString:@"现价:¥"];
            [nowPrice addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(3, 1)];
            cell.nowPriceLabel.attributedText = nowPrice;
    

    5--判断点击点是否在某一区域内

    
    //矩形区间判断点击点范围
    
    /*
    
    //    //点击点(在tableview中)
    //    CGPoint tableViewPoint = [sender locationInView:self.myTableView];
    //
    //    CGRect rect00 = [oneCell convertRect:oneCell.firstAddImageView.frame toView:self.myTableView];
    
    //    if (CGRectContainsPoint(rect00, tableViewPoint)) {
    //        NSLog(@"第一行,第一个");
    //        [self addPicture:oneCell withIndex:0];
    //        return;
    //    }
    
     */
    

    6--等待某一事件执行完成之后再执行其他

    
    有时候系统的方法在for循环里,即使用线程也没有办法保证优先走完整个循环再执行后边的,以下办法亲测有效
    
    ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
        
        for (NSURL  *url in self.finalImagesArray) {
            
            dispatch_async(queue, ^{
            
                [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset)  {
                
                   UIImage * image = [UIImage imageWithCGImage:asset.aspectRatioThumbnail];
    
                    NSData *data = [HGRequestManager reSizeImageData:image maxImageSize:800  maxSizeWithKB:1024.0];
                    
                    NSString *string = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    
              
                    
                    [imageArray addObject:string];
                    NSLog(@"转码中...");
                    
                    dispatch_semaphore_signal(sema);
                }failureBlock:^(NSError *error) {
                   dispatch_semaphore_signal(sema);
                    NSLog(@"error=%@",error);
                }];
                
                
            });
            
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    
        }
    
    
    

    7--下拉刷新与上拉加载

    // 1.下拉刷新  
       _tableView.mj_header= [MJRefreshNormalHeader headerWithRefreshingBlock:^{  
           // 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)  
           dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
               // 结束刷新  
               [_tableView.mj_header endRefreshing];  
           });  
       }];  
         
       // 设置自动切换透明度(在导航栏下面自动隐藏)  
       _tableView.mj_header.automaticallyChangeAlpha = YES;  
         
       // 2.上拉加载  
       _tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{  
           // 模拟延迟加载数据,因此2秒后才调用(真实开发中,可以移除这段gcd代码)  
           dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
               // 结束刷新  
               [_tableView.mj_footer endRefreshing];  
           });  
       }];  
    

    8--二维码扫描识别区域问题

        //设置rectOfInterest///CGRectMake(y的起点/屏幕的高,x的起点/屏幕的宽,扫描的区域的高/屏幕的高,扫描的区域的宽/屏幕的宽)
    //    //扫描框
        _boxView = [[UIView alloc]init];
        _boxView.frame = CGRectMake(0, 0,SCREEN_WIDTH * 0.6, 120);
        _boxView.center = self.view.center;
    //    _boxView = [[UIView alloc]initWithFrame:CGRectMake(0,0,100,100)];
        _boxView.layer.borderColor = [UIColor redColor].CGColor;
        _boxView.layer.borderWidth = 0.5f;
        [_scanView addSubview:_boxView];
    
    
        outPut.rectOfInterest = CGRectMake(_boxView.frame.origin.y/SCREEN_HEIGHT, _boxView.frame.origin.x/SCREEN_WIDTH, _boxView.frame.size.height/SCREEN_HEIGHT,  _boxView.frame.size.width/SCREEN_WIDTH);
    

    9--使用贝塞尔曲线实现button圆角

    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)];
    view2.backgroundColor = [UIColor redColor];
    [self.view addSubview:view2];
    
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds      byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight    cornerRadii:CGSizeMake(10, 10)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = view2.bounds;
    maskLayer.path = maskPath.CGPath;
    view2.layer.mask = maskLayer;
    

    10--设置日期时的dateFormatter代号

    纪元的显示:
    G:显示AD,也就是公元 
    年的显示:
    yy:年的后面2位数字
    yyyy:显示完整的年 
    月的显示:
    M:显示成1~12,1位数或2位数
    MM:显示成01~12,不足2位数会补0
    MMM:英文月份的缩写,例如:Jan
    MMMM:英文月份完整显示,例如:January
    
    日的显示:
    d:显示成1~31,1位数或2位数
    dd:显示成01~31,不足2位数会补0 
    星期的显示:
    EEE:星期的英文缩写,如Sun
    EEEE:星期的英文完整显示,如,Sunday
     
    上/下午的显示:
    aa:显示AM或PM
    
    小時的显示:
    H:显示成0~23,1位数或2位数(24小时制
    HH:显示成00~23,不足2位数会补0(24小时制)
    K:显示成0~12,1位数或2位数(12小時制)
    KK:显示成0~12,不足2位数会补0(12小时制)
    
    分的显示:
    m:显示0~59,1位数或2位数
    mm:显示00~59,不足2位数会补0
    
    秒的显示:
    s:显示0~59,1位数或2位数
    ss:显示00~59,不足2位数会补0
    S: 毫秒的显示
    
    时区的显示:
    z / zz /zzz :PDT
    zzzz:Pacific Daylight Time
    Z / ZZ / ZZZ :-0800
    ZZZZ:GMT -08:00
    v:PT
    vvvv:Pacific Time
    
    

    11--GCD网站

    http://www.samirchen.com/ios-gcd/
    

    12--iOS坐标转换

    
    iOS-- UIView中的坐标转换
    
    // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
    - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
    // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
    - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
    
    // 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
    - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
    // 将rect从view中转换到当前视图中,返回在当前视图中的rect
    - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
    
    例把UITableViewCell中的subview(btn)的frame转换到 controllerA中
    
    // controllerA 中有一个UITableView, UITableView里有多行UITableVieCell,cell上放有一个button
    // 在controllerA中实现:
    CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];
    或
    CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell];
    // 此rc为btn在controllerA中的rect
    
    或当已知btn时:
    CGRect rc = [btn.superview convertRect:btn.frame toView:self.view];
    或
    CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];
    
    版权:转自http://blog.csdn.net/xuhuan_wh/article/details/8486337
    
    

    13--为系统类添加属性

    新建时选择category

    
    @interface NSString (Ass)  
      给NSString类添加两种类型的属性, 字符串类型的tag值strFlag, 以及int型的tag值intTag. 
    定义这个两个属性的set和get方法:
    // 对象属性的set和get  
    - (void)setStrFlag:(NSString *)strFlag;  
    - (NSString *)strFlag;  
      
    // 非对象属性的set和get  
    - (void)setIntFlag:(int)intFlag;  
    - (int)intFlag;  
      
    @end 
    
    实现这四个方法:
    需导入runtime头文件:
    #import <objc/runtime.h> 
    @implementation NSString (Ass)  
      
    static int _intFlag;  
      
    static NSString *_strFlag;  
      
    - (void)setStrFlag:(NSString *)flag {  
        // void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)  
        objc_setAssociatedObject(self, &_strFlag, flag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
    }  
      
    - (NSString *)strFlag {  
        // id objc_getAssociatedObject(id object, const void *key)  
        return objc_getAssociatedObject(self, &_strFlag);  
    }  
      
    - (void)setIntFlag:(int)intFlag {  
        NSNumber *t = @(intFlag);  
        // void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)  
        objc_setAssociatedObject(self, &_intFlag, t, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
    }  
    - (int)intFlag {  
        // id objc_getAssociatedObject(id object, const void *key)  
        NSNumber *t = objc_getAssociatedObject(self, &_intFlag);  
        return (int)[t integerValue];  
    }  
      
    @end  
    
    

    14--去掉tableViewCell的下方分割线

    - (void)addSubview:(UIView *)view{
    
        if (![view isKindOfClass:[NSClassFromString(@"_UITableViewCellSeparatorView") class]] && view){
            
            [super addSubview:view];
        }
    }
    

    15--Xcode出现The file couldn’t be opened
    一般是因为在代码合并时出现冲突,右键showInFinder打开工程蓝色project文件,

    project.pbxproj
    然后在右键选择色显示包内容,打开project.pbxproj文件 ,command + F查找===
    查找冲突,使用=== 也就是冲突,手动解决后再提交就可以了
    16--首次提交代码到git仓库时报错

    一般是由于在git上新建项目的时候加了MIT许可证,导致本地与远程冲突,解决办法,强制提交git push -u origin master -f或者 git pull origin master --allow-unrelated-histories

    17--npm start项目启动报错
    目前遇到的一次是因为有文件修改了没有提交,用git stash 或者git add后就可以了,其他情况遇到再说
    18--布局时tableView向下弹64
    如果上下边边界选择的是mas_bottomLayoutGuide以及mas_topLayoutGuide,页面出现后就会向下弹64,解决办法是下边界不要直接去以页面为准,可以参考另一个控件配置,比如在tableView下面放一个提交按钮.
    原因暂时不明:

    -(UITableView *)orderTableView{
        if (!_orderTableView) {
     
            _orderTableView = [UITableView new];
            [self.view addSubview:_orderTableView];
            _orderTableView.delegate = self;
            _orderTableView.dataSource = self;
            [_orderTableView mas_makeConstraints:^(MASConstraintMaker *make) {
                
                make.top.mas_equalTo(self.mas_topLayoutGuideBottom);
                make.width.mas_equalTo(self.view);
                make.centerX.mas_equalTo(self.view);
                make.bottom.mas_equalTo(self.submitButton.mas_top).with.offset(-10);
            }];
        }
        return _orderTableView;
    }
    

    19--SQLITE中exists的用法
    一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

    20--sqlite 复制表

    【复制表结构及数据】
    CREATE TABLE NEW_TABLE(新表) AS SELECT * FROM (OLD_TABLE);
    【仅仅复制结构,不复制数据】
    CREATE TABLE NEW_TABLE AS SELECT * FROM WHERE 1=2;,跟上面的相比,加了where语句并将条件设为假

    21--CKContainer获取iCloud账号返回值不准确
    在iOS设备明明有账号登录,返回值却是没有账号登录,原因是设置中iCloud中iCloud Drive没有针对该app打开,导致iCloud不能正常工作

    22--直接判断网络是否连接

    + (BOOL)connectedToNetwork
    {
        // Create zero addy
        struct sockaddr_in zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin_len = sizeof(zeroAddress);
        zeroAddress.sin_family = AF_INET;
        
        // Recover reachability flags
        SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
        SCNetworkReachabilityFlags flags;
        
        BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
        CFRelease(defaultRouteReachability);
        
        if (!didRetrieveFlags)
        {
            printf("Error. Could not recover network reachability flags\n");
            return NO;
        }
        
        BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
        BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
        return (isReachable && !needsConnection) ? YES : NO;
    }
    

    相关文章

      网友评论

          本文标题:工作笔记

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