美文网首页
ios小知识点整理第四期(持续更新)

ios小知识点整理第四期(持续更新)

作者: coder小鹏 | 来源:发表于2021-01-13 19:03 被阅读0次

判断给定的时间是否是今天,如果是今天,则显示分和秒,如果是今年,则显示月日时分秒,否则显示年月日时分秒

- (NSString *)translateDateFormWithLastUpdatedTime:(NSDate *)lastUpdatedTime
{
    //判断给定的时间是否是今天,如果是今天,则显示分和秒,如果是今年,则显示月日时分秒,否则显示年月日时分秒
    NSCalendar *calendar = [self currentCalendar];
    NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute;
    NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime];
    NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]];
    
    // 2.格式化日期
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    BOOL isToday = NO;
    if ([cmp1 day] == [cmp2 day]) { // 今天
        formatter.dateFormat = @" HH:mm";
        isToday = YES;
    } else if ([cmp1 year] == [cmp2 year]) { // 今年
        formatter.dateFormat = @"MM-dd HH:mm";
    } else {
        formatter.dateFormat = @"yyyy-MM-dd HH:mm";
    }
    
    NSString *time = [formatter stringFromDate:lastUpdatedTime];
    
    return time;
}

#pragma mark - 日历获取在9.x之后的系统使用currentCalendar会出异常。在8.0之后使用系统新API。
- (NSCalendar *)currentCalendar {
    if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) {
        return [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    }
    return [NSCalendar currentCalendar];
}

计算文字的宽度,给UILabel添加分类,具体代码如下

- (CGFloat)mj_textWith {
    CGFloat stringWidth = 0;
    CGSize size = CGSizeMake(MAXFLOAT, MAXFLOAT);
    if (self.text.length > 0) {
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
        stringWidth =[self.text
                      boundingRectWithSize:size
                      options:NSStringDrawingUsesLineFragmentOrigin
                      attributes:@{NSFontAttributeName:self.font}
                      context:nil].size.width;
#else
        
        stringWidth = [self.text sizeWithFont:self.font
                            constrainedToSize:size
                                lineBreakMode:NSLineBreakByCharWrapping].width;
#endif
    }
    return stringWidth;
}

过期提醒,来源于明杰的下拉刷新库

// 过期提醒
#define MJRefreshDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)

ios float类型四舍五入的方法

(floorf(bonusRate*100 + 0.5))/100

导航栏上移20像素的解决方案

  • info.plist文件中将View controller-based status bar appearance设置为YES
  • 在出现问题的控制器中添加如下代码
- (BOOL)prefersStatusBarHidden
{
    return NO;
}

16进制CRC校验算法

unsigned short tmp = 0xffff;
    unsigned short ret1 = 0;
    unsigned char buff[10] = {0};
    buff[0] = 0xFE;
    buff[1] = 0x01;
    buff[2] = 0x00;
    buff[3] = 0x00;
    buff[4] = 0x00;
    buff[5] = 0x00;
    buff[6] = 0x00;
    buff[7] = 0x00;
    buff[8] = 0x00;
    buff[9] = 0x00;
    
    for(int n = 0; n < 10; n++){/*此处的6 -- 要校验的位数为6个*/
        tmp = buff[n] ^ tmp;
        for(int i = 0;i < 8;i++){  /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
            if(tmp & 0x01){
                tmp = tmp >> 1;
                tmp = tmp ^ 0xa001;
            }
            else{
                tmp = tmp >> 1;
            }
        }
    }
    /*CRC校验后的值*/
    printf("%X\n",tmp);
    /*将CRC校验的高低位对换位置*/
    ret1 = tmp >> 8;
    ret1 = ret1 | (tmp << 8);
    printf("ret: %X\n",ret1);

OC中16进制转浮点数方法

 NSString *temp = [NSString stringWithFormat:@"%@%@",@"0x",[[[temp0 stringByAppendingString:temp1] stringByAppendingString:temp2] stringByAppendingString:temp3]];
            
 const char *str = NULL;
    if ([temp canBeConvertedToEncoding:NSUTF8StringEncoding]) {
        str = [temp cStringUsingEncoding:NSUTF8StringEncoding];
    }
 unsigned long num;
 char * leftover;
 num = strtoul(str, &leftover, 0);
            
 float result = Hex2Float(num);
 printf("result = %f \n",result);
 
 //十六进制数转浮点数通用方法
float Hex2Float(unsigned long number)
{
    unsigned int sign = (number & 0x80000000) ? -1 : 1;
    unsigned int exponent = ((number >> 23) & 0xff) - 127;
    float mantissa = 1 + ((float)(number & 0x7fffff) / 0x7fffff);
    return sign * mantissa * pow(2, exponent);
}

OC中将16进制字符串转换为NSData的方法

- (NSData *)convertHexStrToData:(NSString *)str
{
    if (!str || [str length] == 0) {
        return nil;
    }
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:20];
    NSRange range;
    if ([str length] % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        range = NSMakeRange(0, 1);
    }
    for (NSInteger i = range.location; i < [str length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [str substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    return hexData;
}

OC中将NSData转换为16进制字符串的方法

- (NSString *)convertDataToHexStr:(NSData *)data
{
    if (!data || [data length] == 0) {
        return @"";
    }
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    return string;
}

相关文章

网友评论

      本文标题:ios小知识点整理第四期(持续更新)

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