美文网首页IOS
iOS开发实用代码

iOS开发实用代码

作者: 楼上那只猫 | 来源:发表于2017-11-03 17:45 被阅读30次

1.设置 UITextField 的placeholder的相关属性

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
NSString *holderText = @"请输入密码!";
NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:holderText];
[placeholder addAttribute:NSForegroundColorAttributeName
              value:[UIColor redColor]
              range:NSMakeRange(0, holderText.length)];
[placeholder addAttribute:NSFontAttributeName
              value:[UIFont boldSystemFontOfSize:16]
              range:NSMakeRange(0, holderText.length)];
textField.attributedPlaceholder = placeholder;

2.字符串转换为日期 日期转换为字符串

NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];//实例化一个NSDateFormatter对象
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//设定时间格式,这里可以设置成自己需要的格式
//要转换的字符串的格式必须和日期格式一致,否则得到的结果为 nil
NSDate *date =[dateFormat dateFromString:@"1980-01-01 00:00:01"]; 
NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];//实例化一个NSDateFormatter对象
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//设定时间格式,这里可以设置成自己需要的格式
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

3.获取版本号

[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

4.获取验证码倒计时

- (void)beginCountDown {
    __block int second = 60;
    __weak JFRegisterController * registerVC = self;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{
        if (second <= 0) {
            dispatch_source_cancel(timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                registerVC.sendCodeButton.userInteractionEnabled = YES;
                [registerVC.sendCodeButton setTitle:@"获取" forState:UIControlStateNormal];
                registerVC.sendCodeButton.backgroundColor = THEME_BLUE_COLOR;
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                [registerVC.sendCodeButton setTitle:[NSString stringWithFormat:@"%d", second] forState:UIControlStateNormal];
                registerVC.sendCodeButton.backgroundColor = RGB(202, 202, 202, 1);
                registerVC.sendCodeButton.userInteractionEnabled = NO;
            });
            second--;
        }
    });
    dispatch_resume(timer);
}

5.给数字添加逗号,实现千分位显示金额.如:1,000,000元

- (NSString *)addCommawithNumber:(NSString *)numString {
    if (numString.length == 0) {
        return numString;
    }
    NSString * tempStr = [numString stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSInteger number = [tempStr integerValue];
    //提取正数部分
    BOOL negative = number < 0;
    NSInteger num = labs(number);
    NSString *numStr = [NSString stringWithFormat:@"%ld",num];
    
    //根据数据长度判断所需逗号个数
    NSInteger length = numStr.length;
    NSInteger count = numStr.length/3;
    
    //在适合的位置插入逗号
    for (int i=1; i<=count; i++) {
        NSInteger location = length - i*3;
        if (location <= 0) {
            break;
        }
        //插入逗号拆分数据
        numStr = [numStr stringByReplacingCharactersInRange:NSMakeRange(location, 0) withString:@","];
    }
    //别忘给负数加上符号
    if (negative) {
        numStr = [NSString stringWithFormat:@"-%@",numStr];
    }
    return numStr;
}

6.让超出父视图范围的子视图响应事件

子视图超出父视图.png

红色view是父视图,绿色是button,子视图,要想实现点击button超出父视图的部分也可以响应事件,需要重写红色view的下面的方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // Convert the point to the target view's coordinate system.
    // The target view isn't necessarily the immediate subview
    CGPoint pointForTargetView = [self.button convertPoint:point fromView:self];
    if (CGRectContainsPoint(self.button.bounds, pointForTargetView)) {

        // The target view may have its view hierarchy,
        // so call its hitTest method to return the right hit-test view
        return [self.button hitTest:pointForTargetView withEvent:event];
    }
    return [super hitTest:point withEvent:event];
}

7.设置 UITextField 的 leftview

UIImageView * leftImv= [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)];
leftImv.image = [UIImage imageNamed:@"search"];
self.searchTF.leftViewMode = UITextFieldViewModeAlways;
self.searchTF.leftView = leftImv;

这种方法设置后,会发现 leftview 的图片紧紧贴着 textfield 的左侧,效果不是很好,为了解决这个问题,一是可以让设计在切图的时候,在图片的四周加一些透明的空白区域,用于填充间距,二是可以通过继承 UITextField,重写下面的方法改变间距.

///设置 lfetview 偏移
- (CGRect)leftViewRectForBounds:(CGRect)bounds
{
    CGRect iconRect = [super leftViewRectForBounds:bounds];
    iconRect.origin.x += 8; //向右边偏8
    return iconRect;
}

这样之后,leftview 的间距问题解决了,但是输入文字会发现文字还是紧贴着 leftview, 可以通过重写下面的方法解决

///UITextField 文字与输入框的距离
- (CGRect)textRectForBounds:(CGRect)bounds{
    return CGRectInset(bounds, 36, 0);   //leftview 偏移8,leftview 的图片大小是21,一共是偏移29,我们设置文字偏移36,也就是距离 leftview 右侧距离为7
}

///控制文本的位置
- (CGRect)editingRectForBounds:(CGRect)bounds{
    return CGRectInset(bounds, 36, 0);
}

8.网络请求时出现以下错误

Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)"

解决办法:

self.manager = [AFHTTPSessionManager manager];
self.manager.responseSerializer = [AFJSONResponseSerializer serializer];    //返回数据为json格式
///加了下面这句代码
self.manager.requestSerializer = [AFJSONRequestSerializer serializer];
///
self.manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
self.manager.requestSerializer.timeoutInterval = 15;
self.manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
                                                                                  @"text/html",
                                                                                  @"text/json",
                                                                                  @"text/plain",
                                                                                  @"text/javascript",
                                                                                  @"text/xml",
                                                                                  @"image/*"]];

9.数字用千分位表示

///把金额数字以千分位形式表示
+ (NSString *)addCommawithNumber:(NSString *)numString {
    if (numString.length == 0) {
        return numString;
    }
    NSString * tempStr = [numString stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSString * leftStr = tempStr;
    NSString * rightStr = @".";
    if ([tempStr containsString:@"."]) {
        NSArray * resArr = [tempStr componentsSeparatedByString:@"."];
        leftStr = resArr[0];
        rightStr = resArr[1];
    }
    NSInteger number = [leftStr integerValue];
    //提取正数部分
    //    BOOL negative = number < 0;
    NSInteger num = labs(number);
    NSString *numStr = [NSString stringWithFormat:@"%ld",num];
    //根据数据长度判断所需逗号个数
    NSInteger length = numStr.length;
    NSInteger count = numStr.length/3;
    
    //在适合的位置插入逗号
    for (int i=1; i<=count; i++) {
        NSInteger location = length - i*3;
        if (location <= 0) {
            break;
        }
        //插入逗号拆分数据
        numStr = [numStr stringByReplacingCharactersInRange:NSMakeRange(location, 0) withString:@","];
    }
    if (![rightStr isEqualToString:@"."]) {
        numStr = [numStr stringByAppendingString:[NSString stringWithFormat:@".%@", rightStr]];
        return numStr;
    }
    //别忘给负数加上符号
    //    if (negative) {
    //        numStr = [NSString stringWithFormat:@"-%@",numStr];
    //    }
    return numStr;
}
  1. 汉字转拼音
+ (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;
}

参数具体介绍
string: 需要转换的字符串。由于这个参数是 CFMutableStringRef 类型,一个 NSMutableString 类型也可以通过自由桥接的方式传入。
range: 转换操作作用的范围。这个参数是 CFRange,而不是 NSRange。当给定为NULL时,操作范围为全部。
transform: 需要应用的变换。这个参数使用了包含下面将提到的字符串常量的 ICU transform string。
reverse: 如有需要,是否返回反转过的变换

11.获取手机 IP 地址

+ (NSString *)getDeviceIPAdress {
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // 检索当前接口,在成功时,返回0
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // 循环链表的接口
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // 检查接口是否en0 wifi连接在iPhone上
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    // 得到NSString从C字符串
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // 释放内存
    freeifaddrs(interfaces);
    return address;
}

12.密码包含数字和字母,且长度在6-12位之间

NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$";
NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if ([pred evaluateWithObject:self.pwdTF.text]) {    //密码符合要求

}

13.AFNetworking 中获取 error 中的信息

NSData * errorData = error.userInfo[@"com.alamofire.serialization.response.error.data"];
        NSString * errStr = [[NSString alloc] initWithData:errorData encoding:NSUTF8StringEncoding];
//errStr即是错误的信息文字

14.获取视频第一帧图片

- (UIImage *)firstFrameWithVideoURL:(NSURL *)url size:(CGSize)size
{
    // 获取视频第一帧
    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:opts];
    AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
    generator.appliesPreferredTrackTransform = YES;
    generator.maximumSize = CGSizeMake(size.width, size.height);
    NSError *error = nil;
    CGImageRef img = [generator copyCGImageAtTime:CMTimeMake(600, 600) actualTime:NULL error:&error];
    {
        return [UIImage imageWithCGImage:img];
    }
    return nil;
}

15.消除 performSelector 造成的警告

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    含有performSelector的代码
#pragma clang diagnostic pop

16.获取设备 IP 地址

+ (NSString *)getDeviceIPAdress {
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // 检索当前接口,在成功时,返回0
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // 循环链表的接口
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // 检查接口是否en0 wifi连接在iPhone上
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    // 得到NSString从C字符串
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // 释放内存
    freeifaddrs(interfaces);
    return address;
}

17.字符串转 float

- (CGFloat)stringToFloat:(NSString *)string {
    NSDecimalNumber * totalNum = [NSDecimalNumber decimalNumberWithString:string];
    NSDecimalNumberHandler * handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    //这里的字符串是保留2位小数的字符串,所以乘100,可以根据情况变化
    NSDecimalNumber * res = [totalNum decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithString:@"100"] withBehavior:handler];
    return [res doubleValue] / 100.0f;
}

相关文章

网友评论

    本文标题:iOS开发实用代码

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