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.让超出父视图范围的子视图响应事件

红色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;
}
- 汉字转拼音
+ (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;
}
网友评论