美文网首页
iOS开发提高效率只写一次的代码

iOS开发提高效率只写一次的代码

作者: KallyKello | 来源:发表于2017-09-28 15:11 被阅读0次

1、获取View所在的Controller

+ (UIViewController *)getViewController:(UIView *)view{
    for (UIView *next = [view superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
}

2、高效的圆角方式

+ (CAShapeLayer *)paintingCircularWithBounds:(CGRect)bounds cornerRadius:(CGFloat)cornerRadius{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds cornerRadius:cornerRadius];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.path = maskPath.CGPath;
    return maskLayer;
}

3、时间的处理

.h文件

/** 获取当前的时间 */
+ (NSString *)currentDateString;
/** 按指定格式获取当前的时间 */
+ (NSString *)currentDateStringWithFormat:(NSString *)formatterStr;

/** 获取固定格式的时间格式*/
+ (NSString *)dateWithDateString:(NSString *)dataString;

/**
 *  是否为今天
 */
- (BOOL)isToday;
/**
 *  是否为昨天
 */
- (BOOL)isYesterday;
/**
 *  是否为今年
 */
- (BOOL)isThisYear;

/**
 *  返回一个只有年月日的时间
 */
- (NSDate *)dateWithYMD;

/**
 *  获得与当前时间的差距
 */
- (NSDateComponents *)deltaWithNow;

/**
 *  获取与当前时间的对比
 */
+ (NSString *)dateWithString:(NSString *)dataString;


/**
 *  时间戳转换成时间
 */
+ (id)timeStampTransformationTimeWithtimeString:(NSString *)timeString;
+ (id)timeStampTransformationYMDTimeWithtimeString:(NSString *)timeString;  //只返回年月日
/**
 *  当前时间转时间戳
 */
+ (NSString *)getCurrentDate;

.m文件

#pragma mark - 获取当前的时间
+ (NSString *)currentDateString {
    return [self currentDateStringWithFormat:@"yyyy-MM-dd HH:mm:ss"];
}

#pragma mark - 按指定格式获取当前的时间
+ (NSString *)currentDateStringWithFormat:(NSString *)formatterStr {
    // 获取系统当前时间
    NSDate *currentDate = [NSDate date];
    // 用于格式化NSDate对象
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 设置格式:yyyy-MM-dd HH:mm:ss
    formatter.dateFormat = formatterStr;
    // 将 NSDate 按 formatter格式 转成 NSString
    NSString *currentDateStr = [formatter stringFromDate:currentDate];
    // 输出currentDateStr
    return currentDateStr;
}

+ (NSString *)dateWithDateString:(NSString *)dataString{
    // 用于格式化NSDate对象
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 设置格式:yyyy-MM-dd HH:mm:ss
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    // 将 NSDate 按 formatter格式 转成 NSString
    NSString *currentDateStr = [formatter stringFromDate:[formatter dateFromString:dataString]];
    // 输出currentDateStr
    return currentDateStr;
}

/**
 *  是否为今天
 */
- (BOOL)isToday
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    int unit = NSCalendarUnitDay | NSCalendarUnitMonth |  NSCalendarUnitYear;
    
    // 1.获得当前时间的年月日
    NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];
    
    // 2.获得self的年月日
    NSDateComponents *selfCmps = [calendar components:unit fromDate:self];
    return
    (selfCmps.year == nowCmps.year) &&
    (selfCmps.month == nowCmps.month) &&
    (selfCmps.day == nowCmps.day);
}

/**
 *  是否为昨天
 */
- (BOOL)isYesterday
{
    // 2014-05-01
    NSDate *nowDate = [[NSDate date] dateWithYMD];
    
    // 2014-04-30
    NSDate *selfDate = [self dateWithYMD];
    
    // 获得nowDate和selfDate的差距
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *cmps = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];
    return cmps.day == 1;
}



- (NSDate *)dateWithYMD
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSString *selfStr = [fmt stringFromDate:self];
    return [fmt dateFromString:selfStr];
}

/**
 *  是否为今年
 */
- (BOOL)isThisYear
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    int unit = NSCalendarUnitYear;
    
    // 1.获得当前时间的年月日
    NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];
    
    // 2.获得self的年月日
    NSDateComponents *selfCmps = [calendar components:unit fromDate:self];
    
    return nowCmps.year == selfCmps.year;
}

- (NSDateComponents *)deltaWithNow
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    int unit = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    return [calendar components:unit fromDate:self toDate:[NSDate date] options:0];
}

+ (NSString *)dateWithString:(NSString *)dataString{
    //日期格式
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *created_at = [fmt dateFromString:dataString];
    
    if ([created_at isThisYear]) {
        //今年
        if ([created_at isToday]) {
            //今天
            //计算跟当前时间的差距
            NSDateComponents *cmp = [created_at deltaWithNow];
            if (cmp.hour > 0 && cmp.hour < 24) {
                return [NSString stringWithFormat:@"%ld小时前",(long)cmp.hour];
            } else if (cmp.minute > 0 && cmp.minute < 60){
                return [NSString stringWithFormat:@"%ld分钟前",(long)cmp.minute];
            } else {
                return @"刚刚";
            }
        } else if ([created_at isYesterday]){
            //昨天
            fmt.dateFormat = @"昨天 HH:mm";
            return [fmt stringFromDate:created_at];
        } else {
            //昨天以前
            fmt.dateFormat = @"MM-dd HH:mm";
            return [fmt stringFromDate:created_at];
        }
    } else {
        //不是今年
        fmt.dateFormat = @"yyyy-MM-dd HH:mm";
        return [fmt stringFromDate:created_at];
    }
}

+ (id)timeStampTransformationTimeWithtimeString:(NSString *)timeString {
    //将时间蹉转换成标准时间
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *confromTimesp = [NSDate dateWithTimeIntervalSince1970:[timeString intValue]];
    return [formatter stringFromDate:confromTimesp];
}

+ (id)timeStampTransformationYMDTimeWithtimeString:(NSString *)timeString {
    //将时间蹉转换成标准时间
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *confromTimesp = [NSDate dateWithTimeIntervalSince1970:[timeString intValue]];
    return [formatter stringFromDate:confromTimesp];
}

+ (NSString *)getCurrentDate{
    //获取当前时间
    NSDate *datenow = [NSDate date];
    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
    return timeSp;
}

4、获取手机各种信息的方法

PhoneMessage.h

#import <Foundation/Foundation.h>

#define WLY_USER_ID @"WLY_USER_ID"
#define WLY_PHONE_NUM @"WLY_PHONE_NUM"
#define WLY_UUID @"WLY_UUID"
#define WLY_APP_VERSION @"WLY_APP_VERSION"
#define WLY_PHONE_TYPE @"WLY_PHONE_TYPE"
#define WLY_APP_SIGN @"WLY_APP_SIGN"
#define WLY_OS_TYPE @"WLY_OS_TYPE"
#define WLY_MAC_TYPE @"WLY_MAC_TYPE"
#define WLY_DEVICEIP_TYPE @"WLY_DEVICEIP_TYPE"
#define WLY_SCREEN_TYPE @"WLY_SCREEN_TYPE"

@interface  PhoneMessage : NSObject

//获取手机的mac地址
+ (NSString *)getAppinfo;

+ (MicPhoneMessage*)shareManage;
@end

PhoneMessage.m

#import "PhoneMessage.h"

#import "sys/utsname.h"
#import <AdSupport/AdSupport.h>

#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>


#import <ifaddrs.h>
#import <arpa/inet.h>
#import <sys/sockio.h>
#import <sys/ioctl.h>

#include <sys/socket.h> // Per msqr
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

#define IOS_CELLULAR    @"pdp_ip0"
#define IOS_WIFI        @"en0"
//#define IOS_VPN       @"utun0"
#define IP_ADDR_IPv4    @"ipv4"
#define IP_ADDR_IPv6    @"ipv6"

@interface PhoneMessage () <CLLocationManagerDelegate>

@property (nonatomic, strong) NSDictionary *phoneDict;

@end

@implementation PhoneMessage

- (NSDictionary *)phoneDict{
    if (!_phoneDict) {
        _phoneDict = [self getAppInfo];
    }
    return _phoneDict;
}

+ (NSDictionary *)getAppinfo {
    return [MicPhoneMessage shareManage].phoneDict;
}

//单例的初始化方法,有很多种,但是这个是苹果官方推荐的。
+ (MicPhoneMessage*)shareManage{
    static MicPhoneMessage *phoneInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        phoneInstance = [[self alloc] init];
    });
    return  phoneInstance;
}

- (NSString *)getMacAddress{
    int mib[6];
    size_t len;
    char *buf;
    unsigned char *ptr;
    struct if_msghdr *ifm;
    struct sockaddr_dl *sdl;
    
    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;
    
    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error/n");
        return NULL;
    }
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1/n");
        return NULL;
    }
    
    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!/n");
        return NULL;
    }
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }
    
    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    
    NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);
    
    return [outstring uppercaseString];
}

//获取ip地址
//获取设备当前网络IP地址
- (NSString *)getIPAddress:(BOOL)preferIPv4
{
    NSArray *searchArray = preferIPv4 ?
    @[ /*IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6,*/ IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
    @[ /*IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4,*/ IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
    
    NSDictionary *addresses = [self getIPAddresses];
    NSLog(@"addresses: %@", addresses);
    
    __block NSString *address;
    [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
     {
         address = addresses[key];
         if(address) *stop = YES;
     } ];
    return address ? address : @"0.0.0.0";
}

//获取所有相关IP信息
- (NSDictionary *)getIPAddresses
{
    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
    
    // retrieve the current interfaces - returns 0 on success
    struct ifaddrs *interfaces;
    if(!getifaddrs(&interfaces)) {
        // Loop through linked list of interfaces
        struct ifaddrs *interface;
        for(interface=interfaces; interface; interface=interface->ifa_next) {
            if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
                continue; // deeply nested code harder to read
            }
            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
                NSString *type;
                if(addr->sin_family == AF_INET) {
                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv4;
                    }
                } else {
                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv6;
                    }
                }
                if(type) {
                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
                    addresses[key] = [NSString stringWithUTF8String:addrBuf];
                }
            }
        }
        // Free memory
        freeifaddrs(interfaces);
    }
    return [addresses count] ? addresses : nil;
}

- (void)getDeviceInfo
{
    // 这个方法后面会列出来
    NSString *deviceName = [self getDeviceName];
    NSLog(@"设备型号-->%@", deviceName);
    
    NSString *iPhoneName = [UIDevice currentDevice].name;
    NSLog(@"iPhone名称-->%@", iPhoneName);
    
    NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSLog(@"app版本号-->%@", appVerion);
    
    NSString *appSign = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleSignature"];
    NSLog(@"app签名信息-->%@",appSign);
    
    CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel];
    NSLog(@"电池电量-->%f", batteryLevel);
    
    NSString *localizedModel = [UIDevice currentDevice].localizedModel;
    NSLog(@"localizedModel-->%@", localizedModel);
    
    NSString *systemName = [UIDevice currentDevice].systemName;
    NSLog(@"当前系统名称-->%@", systemName);
    
    NSString *systemVersion = [UIDevice currentDevice].systemVersion;
    NSLog(@"当前系统版本号-->%@", systemVersion);
    
    NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    NSLog(@"唯一识别码uuid-->%@", uuid);
    
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *device_model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    NSLog(@"device_model-->%@", device_model);
    
    // 这个方法后面会单独列出
    NSString *macAddress = [self getMacAddress];
    NSLog(@"macAddress-->%@", macAddress);
    
    // 这个方法后面会单独列出
    NSString *deviceIP = [self getDeviceIPAddresses];
    NSLog(@"deviceIP-->%@", deviceIP);
}

- (NSString *)getOSInfo
{
    NSString *versionStr = [[UIDevice currentDevice] systemVersion];
//    NSString *versionStr = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];
    return versionStr;
}

// 获取设备型号然后手动转化为对应名称
- (NSString *)getDeviceName
{
    // 需要#import "sys/utsname.h"
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    if ([deviceString isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,2"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,3"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([deviceString isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
    if ([deviceString isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([deviceString isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([deviceString isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([deviceString isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([deviceString isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([deviceString isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([deviceString isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
    if ([deviceString isEqualToString:@"iPhone9,1"])    return @"国行、日版、港行iPhone 7";
    if ([deviceString isEqualToString:@"iPhone9,2"])    return @"港行、国行iPhone 7 Plus";
    if ([deviceString isEqualToString:@"iPhone9,3"])    return @"美版、台版iPhone 7";
    if ([deviceString isEqualToString:@"iPhone9,4"])    return @"美版、台版iPhone 7 Plus";
    
    if ([deviceString isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([deviceString isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([deviceString isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([deviceString isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([deviceString isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";
    
    if ([deviceString isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([deviceString isEqualToString:@"iPad1,2"])      return @"iPad 3G";
    if ([deviceString isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,2"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([deviceString isEqualToString:@"iPad2,4"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,6"])      return @"iPad Mini";
    if ([deviceString isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad3,3"])      return @"iPad 3";
    if ([deviceString isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,5"])      return @"iPad 4";
    if ([deviceString isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,6"])      return @"iPad Mini 2";
    if ([deviceString isEqualToString:@"iPad4,7"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,8"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,9"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (LTE)";
    if ([deviceString isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
    if ([deviceString isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
    if ([deviceString isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9";
    if ([deviceString isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9";
    
    if ([deviceString isEqualToString:@"i386"])         return @"Simulator";
    if ([deviceString isEqualToString:@"x86_64"])       return @"Simulator";
    
    return deviceString;
}

- (NSString *)getDeviceIPAddresses {
    
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
    NSMutableArray *ips = [NSMutableArray array];
    
    int BUFFERSIZE = 4096;
    
    struct ifconf ifc;
    
    char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
    struct ifreq *ifr, ifrcopy;
    
    ifc.ifc_len = BUFFERSIZE;
    ifc.ifc_buf = buffer;
    
    if (ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){
        
        for (ptr = buffer; ptr < buffer + ifc.ifc_len; ){
            
            ifr = (struct ifreq *)ptr;
            int len = sizeof(struct sockaddr);
            
            if (ifr->ifr_addr.sa_len > len) {
                len = ifr->ifr_addr.sa_len;
            }
            
            ptr += sizeof(ifr->ifr_name) + len;
            if (ifr->ifr_addr.sa_family != AF_INET) continue;
            if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) *cptr = 0;
            if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) continue;
            
            memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
            ifrcopy = *ifr;
            ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
            
            if ((ifrcopy.ifr_flags & IFF_UP) == 0) continue;
            
            NSString *ip = [NSString  stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr)];
            [ips addObject:ip];
        }
    }
    
    close(sockfd);
    NSString *deviceIP = @"";
    
    for (int i=0; i < ips.count; i++) {
        if (ips.count > 0) {
            deviceIP = [NSString stringWithFormat:@"%@",ips.lastObject];
        }
    }
    return deviceIP;
}


//获取登陆用户id
- (NSString *)getUserid
{
//    GlobleData *shared = [GlobleData sharedInstance];
//    NSString *userid = shared.userid;
    return @"aaaa";
}
//获取登陆用户手机号
- (NSString *)getPhoneNum
{
    NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
    
    NSString *uid = [userDefaultes objectForKey:@"usr.loginid"];
    return uid;
}

//获取设备惟一标示符
- (NSString *)getUUID
{
    NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    return uuid;
}
//获取app版本号
- (NSString *)getVersion
{
    NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    return appVerion;
}

- (NSString *)getScreen{
    if (iPhone4) {
        return @"3.5英寸";
    } else if (iPhone5) {
        return @"4.0英寸";
    } else if (iPhone6){
        return @"4.7英寸";
    } else if (iPhone6P){
        return @"5.5英寸";
    }
    return @"未识别";
}

- (void)getlocation{
    
}



//获取用户手机号,uuid,手机型号,版本号,签名,平台(ios/android)
- (NSDictionary *)getAppInfo
{
    NSMutableDictionary *appInfoDict = [[NSMutableDictionary alloc] init];
//    NSString *phonenum = [self getPhoneNum];
    NSString *uuid = [self getUUID];
    NSString *deviceType = [self getDeviceName];
    NSString *version = [self getVersion];
    NSString *appsign = @"B";
    NSString *platform = @"1";
//    NSString *userid = [self getUserid];
    NSString *macAddress = [self getMacAddress];
    NSString *deviceIPAddresses = [self getDeviceIPAddresses];
    NSString *screenString = [self getScreen];
//    [appInfoDict setObject:userid forKey:WLY_USER_ID];
//    [appInfoDict setObject:phonenum forKey:WLY_PHONE_NUM];
    [appInfoDict setObject:uuid forKey:WLY_UUID];
    [appInfoDict setObject:version forKey:WLY_APP_VERSION];
    [appInfoDict setObject:deviceType forKey:WLY_PHONE_TYPE];
    [appInfoDict setObject:appsign forKey:WLY_APP_SIGN];
    [appInfoDict setObject:platform forKey:WLY_OS_TYPE];
    [appInfoDict setObject:macAddress forKey:WLY_MAC_TYPE];
    [appInfoDict setObject:deviceIPAddresses forKey:WLY_DEVICEIP_TYPE];
    [appInfoDict setObject:screenString forKey:WLY_SCREEN_TYPE];
//    NSLog(@"getAppInfo:%@",appInfoDict);
    return appInfoDict;
}

-(void)_startLocation
{
    if([CLLocationManager locationServicesEnabled])
    {
        // 启动位置更新
        // 开启位置更新需要与服务器进行轮询所以会比较耗电,在不需要时用stopUpdatingLocation方法关闭;
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        //设置定位的精度
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
        locationManager.distanceFilter = 10.0f;
        locationManager.delegate = self;
        if ([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0)
        {
            [locationManager requestAlwaysAuthorization];
            [locationManager requestWhenInUseAuthorization];
        }
        
        //开始实时定位
        [locationManager startUpdatingLocation];
    }else {
        NSLog(@"请开启定位功能!");
    }
}

@end

5、富文本和字符串的处理

.h文件

/**
 *  设置颜色的字符串
 *  @string 总字符串
 *  @textColorDict 修改的字符串和颜色
 *
 *  @{@"key":@"value"} => @{@"str": color}
 *  @str:修改颜色的字符串
 *  @color:颜色
 */
+ (NSAttributedString *)attributedStringChangePortionTextColor:(NSString *)string textColorDict:(NSDictionary *)textColorDict;

/**
 *  两端对齐
 *
 *  @prame string 需要对齐的字符串
 **/
+ (NSAttributedString *)attributedStringAlignmentBothWithString:(NSString *)string;

/**
 *  设置文本行间距
 *
 *  @prame  lineSpacing 行间距
 *  @prame  font        字体大小
 *  @prame  textString  字符串
 */
+ (NSAttributedString *)attributedStringLineSpacing:(CGFloat)lineSpacing font:(CGFloat)font textString:(NSString *)textString;

/**
 *  计算固定宽的字符串大小
 *
 *  @prame  sizeWidth 宽
 *  @prame  font      字体大小
 *  @prame  textString  字符串
 *  @prame  lineSpacing 行间距
 */
+ (CGSize)textStringFixedWidthWithSize:(CGFloat)sizeWidth font:(CGFloat)font textString:(NSString *)textString lineSpacing:(CGFloat)lineSpacing;

.m文件

+ (NSAttributedString *)attributedStringChangePortionTextColor:(NSString *)string textColorDict:(NSDictionary *)textColorDict{
    NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:string];
    
    //获取要调整的文字和颜色
    NSArray *textArray = [textColorDict allKeys];
    NSArray *colorArray = [textColorDict allValues];
    
    int index = 0;
    //获取要调整颜色的文字位置
    for (NSString *text in textArray) {
        NSRange range = [string rangeOfString:text];
        [aString addAttribute:NSForegroundColorAttributeName value:colorArray[index] range:range];
        index ++;
    }
    
    return aString;
}

+ (NSAttributedString *)attributedStringAlignmentBothWithString:(NSString *)string{
    NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:string];
    NSMutableParagraphStyle *pStyle = [[NSMutableParagraphStyle alloc] init];
    pStyle.alignment = NSTextAlignmentJustified;    // 两端对齐
    NSDictionary *dict = @{NSParagraphStyleAttributeName : pStyle};
    [aString setAttributes:dict range:NSMakeRange(0, string.length)];
    return aString;
}

+ (NSAttributedString *)attributedStringLineSpacing:(CGFloat)lineSpacing font:(CGFloat)font textString:(NSString *)textString{
    NSMutableParagraphStyle   *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpacing];//行间距
    paragraphStyle.alignment = NSTextAlignmentJustified;//文本对齐方式 左右对齐(两边对齐)
    
    NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:textString];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [textString length])];//设置段落样式
    [attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:font] range:NSMakeRange(0, [textString length])];//设置字体大小
    [attributedString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleNone] range:NSMakeRange(0, [textString length])];
    return attributedString;
}

+ (CGSize)textStringFixedWidthWithSize:(CGFloat)sizeWidth font:(CGFloat)font textString:(NSString *)textString lineSpacing:(CGFloat)lineSpacing{
    NSMutableParagraphStyle   *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpacing];//行间距
    paragraphStyle.alignment = NSTextAlignmentJustified;//文本对齐方式 左右对齐(两边对齐)
    return [textString boundingRectWithSize:CGSizeMake(sizeWidth, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:font],NSParagraphStyleAttributeName:paragraphStyle} context:nil].size;
}

6、对图片的处理

.h文件

/**
 ** lineView:       需要绘制成虚线的view
 ** lineLength:     虚线的宽度
 ** lineSpacing:    虚线的间距
 ** lineColor:      虚线的颜色
 **/
+ (void)drawDashLine:(UIView *)lineView lineLength:(int)lineLength lineSpacing:(int)lineSpacing lineColor:(UIColor *)lineColor;

//绘制图片
+(UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size;

#pragma mark 参数view即我们要截取的控件以及控件上的所有视图
+ (UIImage *)imageFromView:(UIView *)view withFrame:(CGRect)theFrame;

//渐变
+ (UIImage *)imageFromColors:(NSArray *)colors ByGradientType:(GradientType)gradientType size:(CGSize)size;

//渲染image
+ (UIImage *)imageWithImage:(UIImage *)image tintColor:(UIColor *)color;

//修改图片颜色
- (UIImage *)imageWithColor:(UIColor *)color;

//裁剪图片
+ (UIImage *)clipWithImageRect:(CGRect)imageRect clipRect:(CGRect)clipRect clipImage:(UIImage *)clipImage;

/**
 *  在一张背景图上绘制文字并且居中
 *
 *  @param str       要绘制到图片上的文字
 *  @param image     背景图片
 *  @param fontSize  文字的大小
 *  @param textColor 文字颜色
 *
 *  @return 绘制上文字的图片
 */
+ (UIImage *)createOtherMerchantImage:(NSString *)str withBgImage:(UIImage *)image withFont:(CGFloat)fontSize withTextColor:(UIColor *)textColor;

.m文件

/**
 ** lineView:       需要绘制成虚线的view
 ** lineLength:     虚线的宽度
 ** lineSpacing:    虚线的间距
 ** lineColor:      虚线的颜色
 **/
+ (void)drawDashLine:(UIView *)lineView lineLength:(int)lineLength lineSpacing:(int)lineSpacing lineColor:(UIColor *)lineColor
{
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    [shapeLayer setBounds:lineView.bounds];
    [shapeLayer setPosition:CGPointMake(CGRectGetWidth(lineView.frame) / 2, CGRectGetHeight(lineView.frame))];
    [shapeLayer setFillColor:[UIColor clearColor].CGColor];
    //  设置虚线颜色为blackColor
    [shapeLayer setStrokeColor:lineColor.CGColor];
    //  设置虚线宽度
    [shapeLayer setLineWidth:CGRectGetHeight(lineView.frame)];
    [shapeLayer setLineJoin:kCALineJoinRound];
    //  设置线宽,线间距
    [shapeLayer setLineDashPattern:[NSArray arrayWithObjects:[NSNumber numberWithInt:lineLength], [NSNumber numberWithInt:lineSpacing], nil]];
    //  设置路径
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, 0);
    CGPathAddLineToPoint(path, NULL,CGRectGetWidth(lineView.frame), 0);
    [shapeLayer setPath:path];
    CGPathRelease(path);
    //  把绘制好的虚线添加上来
    [lineView.layer addSublayer:shapeLayer];
}

+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size{
    CGRect rect=CGRectMake(0.0f, 0.0f, size.width, size.height);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage*theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}

#pragma mark 参数view即我们要截取的控件以及控件上的所有视图
+ (UIImage *)imageFromView:(UIView *)view withFrame:(CGRect)theFrame
{
    UIImage* image = nil;//最终返回的image
    
    //设置截取尺寸
    CGSize size = CGSizeMake(theFrame.size.width, theFrame.size.height);
    
    //高清处理
    UIGraphicsBeginImageContextWithOptions(size, YES, [UIScreen mainScreen].scale);
    [view.layer renderInContext: UIGraphicsGetCurrentContext()];
    
    //得到图片
    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return  image;
}


+ (UIImage *)imageFromColors:(NSArray *)colors ByGradientType:(GradientType)gradientType size:(CGSize)size{
    NSMutableArray *ar = [NSMutableArray array];
    for(UIColor *c in colors) {
        [ar addObject:(id)c.CGColor];
    }
    UIGraphicsBeginImageContextWithOptions(size, YES, 1);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGColorSpaceRef colorSpace = CGColorGetColorSpace([[colors lastObject] CGColor]);
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)ar, NULL);
    CGPoint start;
    CGPoint end;
    switch (gradientType) {
        case 0:
            start = CGPointMake(0.0, 0.0);
            end = CGPointMake(0.0, size.height);
            break;
        case 1:
            start = CGPointMake(0.0, 0.0);
            end = CGPointMake(size.width, 0.0);
            break;
        case 2:
            start = CGPointMake(0.0, 0.0);
            end = CGPointMake(size.width, size.height);
            break;
        case 3:
            start = CGPointMake(size.width, 0.0);
            end = CGPointMake(0.0, size.height);
            break;
        default:
            break;
    }
    CGContextDrawLinearGradient(context, gradient, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    CGGradientRelease(gradient);
    CGContextRestoreGState(context);
    CGColorSpaceRelease(colorSpace);
    UIGraphicsEndImageContext();
    return image;
}

//渲染image
+ (UIImage *)imageWithImage:(UIImage *)image tintColor:(UIColor *)color {
    UIGraphicsBeginImageContextWithOptions(image.size,NO, image.scale);
    CGContextRef context =UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1, -1);
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    CGContextClipToMask(context, rect, image.CGImage);
    UIRectFillUsingBlendMode(rect,kCGBlendModeNormal);
    UIImage *newImage =UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

- (UIImage *)imageWithColor:(UIColor *)color
{
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, kCGBlendModeNormal);
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextClipToMask(context, rect, self.CGImage);
    [color setFill];
    CGContextFillRect(context, rect);
    UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

//裁剪图片
+ (UIImage *)clipWithImageRect:(CGRect)imageRect clipRect:(CGRect)clipRect clipImage:(UIImage *)clipImage{
    
    // 开启位图上下文
    UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0);
    
    // 设置裁剪区域
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:clipRect];
    
    [path addClip];
    
    // 绘制图片
    [clipImage drawInRect:clipRect];
    
    // 获取当前图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 关闭上下文
    UIGraphicsEndImageContext();
    
    return image;
    
}

//文字转换成图片
+ (UIImage *)createOtherMerchantImage:(NSString *)str withBgImage:(UIImage *)image withFont:(CGFloat)fontSize withTextColor:(UIColor *)textColor{
    CGSize size= CGSizeMake (image.size.width , image.size.height ); // 画布大小
    
    UIGraphicsBeginImageContextWithOptions (size, NO , 0.0 );
    
    [image drawAtPoint : CGPointMake ( 0 , 0 )];
    
    // 获得一个位图图形上下文
    
    CGContextRef context= UIGraphicsGetCurrentContext ();
    
    CGContextDrawPath (context, kCGPathStroke );
    
    //画自己想画的内容。。。。。
    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
    paragraphStyle.alignment = NSTextAlignmentCenter;
    
    UIFont  *font = [UIFont boldSystemFontOfSize:fontSize];//定义默认字体
    //计算文字的宽度和高度:支持多行显示
    CGSize sizeText = [str boundingRectWithSize:size
                                        options:NSStringDrawingUsesLineFragmentOrigin
                                     attributes:@{
                                                  NSFontAttributeName:font,//设置文字的字体
                                                  NSKernAttributeName:@3,//文字之间的字距
                                                  }
                                        context:nil].size;
    
    //为了能够垂直居中,需要计算显示起点坐标x,y
    CGRect rect = CGRectMake((size.width-sizeText.width)/2, (size.height-sizeText.height)/2, sizeText.width, sizeText.height);
    
    [str drawInRect:rect withAttributes:@{ NSFontAttributeName :[UIFont systemFontOfSize:fontSize], NSForegroundColorAttributeName :textColor,NSParagraphStyleAttributeName:paragraphStyle} ];
    
    //画自己想画的内容。。。。。
    // 返回绘制的新图形
    UIImage *newImage= UIGraphicsGetImageFromCurrentImageContext ();
    
    UIGraphicsEndImageContext ();
    
    return newImage;
}

相关文章

网友评论

      本文标题:iOS开发提高效率只写一次的代码

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