第一步:在info.plist中添加一个字段:view controller -base status bar 设置为NOcss
第二步:在一个全部界面都继承的父类里添加:ios
if (IOS7_OR_LATER) { // 判断是不是IOS7 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO]; }
NSString *tempstring = [dic objectForKey:key];//@"[]{}(#%-*+=_)\\|~(<>$%^&*)_+ " NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"@¥"]; tempstring = [[tempstring componentsSeparatedByCharactersInSet:doNotWant]componentsJoinedByString:@""];
在代理中,其实也不是用weak来修饰。在MRC的时候是用assign来修饰,在ARC以后用unsafe_unretained,做用是跟weak相似的。主要是为了防止循环引用。好比A引用了B,B引用了C,C又引用了A,这样循环引用以后,若是用strong强引用来修饰,这个代理就永远释放不掉了。git
[self.tableView reloadData]; [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
官网下载地址: http://www.macupdate.com/app/mac/26079/mesasqlite/downloadgithub
通过实验发现iOS5和iOS6里面,轻点手势和按钮的点击冲突机制是不一样的,结果以下:web
一个UIView上若是添加了一个按钮,又添加了Tap手势正则表达式
在iOS5的设备上跑会只响应Tap手势,按钮不响应点击事件,只会有higlighted效果 在iOS5的设备上跑,按住了按钮,当过了3,4秒左右,跳过Tap手势的识别,再松手,按钮会响应 在iOS6的设备上跑,二者不会冲突,按钮能够点击,非按钮区域能够Tap手势sql
结论就是iOS5和6之间对于事件响应关系是有区别对待的,并且tap响应时间事后,系统会开始判断点击按钮,把刚才的长按理解为长期的touch down状态。这样处理我感受很奇怪,万全之策仍是要解决冲突,由于首先响应Tap事件,因此处理Tap事件的代理方法,过滤掉UIButton的影响。数据库
具体实现,首先添加UIGestureRecognizerDelegate协议,而后把 Tap手势识别对象设置代理self,而后实现以下代码:xcode
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ return NO; } return YES; }
iOS7缓存
#pragma mark - UIGestureRecognizerDelegate - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { UIView *view = touch.view; if ([[view.subviews lastObject] isKindOfClass:[UIButton class]]) { return NO; } return YES; }
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; #pragma mark - #pragma mark Responding to keyboard events //键盘通知事件 - (void)keyboardWillChangeFrame:(NSNotification*)notification { if ([self currentFirstResponder]) { float changeHeight = 0.0; NSDictionary *info = [notification userInfo]; NSValue *valueEnd = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; // NSValue *valueBegin = [info objectForKey:UIKeyboardFrameBeginUserInfoKey]; NSNumber *duration = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; // NSNumber *curve = [info objectForKey:UIKeyboardAnimationCurveUserInfoKey]; CGRect rectEnd = [valueEnd CGRectValue]; // CGRect rectBegin = [valueBegin CGRectValue]; CGRect main = self.view.window.frame; changeHeight = main.size.height - rectEnd.origin.y; if (changeHeight < 0) { changeHeight = 0; } [UIView animateWithDuration:[duration doubleValue] animations:^{ _keyLayoutView.frame = CGRectMake(0, 0, _detailView.frame.size.width, _detailView.frame.size.height-changeHeight); } completion:^(BOOL finished) { [self getFirstResponder:self.scrollView]; }]; } }
//获取scrollView的第一响应移屏
-(void)getFirstResponder:(UIView*)view { for (UIView *subView in view.subviews) { if ([subView isFirstResponder]) { CGRect rect; if ([self.scrollView.subviews containsObject:subView]) { rect = subView.frame; }else { rect = [self.scrollView convertRect:subView.frame fromView:subView.superview]; } if(rect.size.height + rect.origin.y > self.scrollView.frame.size.height+self.scrollView.contentOffset.y) { CGPoint point = CGPointMake(self.scrollView.contentOffset.x, rect.size.height+rect.origin.y-self.scrollView.frame.size.height); [self.scrollView setContentOffset:point animated:YES]; } return; } [self getFirstResponder:subView]; } }
应该是product name名字是中文才出现的问题(算是xcode的bug么?),解决办法:把product name中的名字改为英文(app的名字若是是中文的,但是在plist中的Bundle display name设置中文,这并不会影响)
UITextFieldDelegate代理里面响应return键的回调:textFieldShouldReturn:。 可是 UITextView的代理UITextViewDelegate 里面并无这样的回调。 可是有别的方法能够实现: UITextViewDelegate里面有这样一个代理函数:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
这个函数的最后一个参数text表明你每次输入的的那个字,因此:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ if ([text isEqualToString:@"\n"]){ //判断输入的字是不是回车,即按下return //在这里作你响应return键的代码 return NO; //这里返回NO,就表明return键值失效,即页面上按下return,不会出现换行,若是为yes,则输入页面会换行 } return YES; }
常规动画属性设置(能够同时选择多个进行设置)
UIViewAnimationOptionLayoutSubviews:动画过程当中保证子视图跟随运动。
UIViewAnimationOptionAllowUserInteraction:动画过程当中容许用户交互。
UIViewAnimationOptionBeginFromCurrentState:全部视图从当前状态开始运行。
UIViewAnimationOptionRepeat:重复运行动画。
UIViewAnimationOptionAutoreverse :动画运行到结束点后仍然以动画方式回到初始点。
UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套动画时间设置。
UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套动画速度设置。
UIViewAnimationOptionAllowAnimatedContent:动画过程当中重绘视图(注意仅仅适用于转场动画)。
UIViewAnimationOptionShowHideTransitionViews:视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画) UIViewAnimationOptionOverrideInheritedOptions :不继承父动画设置或动画类型。
2.动画速度控制(可从其中选择一个设置)
UIViewAnimationOptionCurveEaseInOut:动画先缓慢,而后逐渐加速。
UIViewAnimationOptionCurveEaseIn :动画逐渐变慢。
UIViewAnimationOptionCurveEaseOut:动画逐渐加速。
UIViewAnimationOptionCurveLinear :动画匀速执行,默认值。
3.转场类型(仅适用于转场动画设置,能够从中选择一个进行设置,基本动画、关键帧动画不须要设置)
UIViewAnimationOptionTransitionNone:没有转场动画效果。
UIViewAnimationOptionTransitionFlipFromLeft :从左侧翻转效果。
UIViewAnimationOptionTransitionFlipFromRight:从右侧翻转效果。
UIViewAnimationOptionTransitionCurlUp:向后翻页的动画过渡效果。
UIViewAnimationOptionTransitionCurlDown :向前翻页的动画过渡效果。
UIViewAnimationOptionTransitionCrossDissolve:旧视图溶解消失显示下一个新视图的效果。
UIViewAnimationOptionTransitionFlipFromTop :从上方翻转效果。
UIViewAnimationOptionTransitionFlipFromBottom:从底部翻转效果
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
+ (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha { //删除字符串中的空格 NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; // String should be 6 or 8 characters if ([cString length] < 6) { return [UIColor clearColor]; } // strip 0X if it appears //若是是0x开头的,那么截取字符串,字符串从索引为2的位置开始,一直到末尾 if ([cString hasPrefix:@"0X"]) { cString = [cString substringFromIndex:2]; } //若是是#开头的,那么截取字符串,字符串从索引为1的位置开始,一直到末尾 if ([cString hasPrefix:@"#"]) { cString = [cString substringFromIndex:1]; } if ([cString length] != 6) { return [UIColor clearColor]; } // Separate into r, g, b substrings NSRange range; range.location = 0; range.length = 2; //r NSString *rString = [cString substringWithRange:range]; //g range.location = 2; NSString *gString = [cString substringWithRange:range]; //b range.location = 4; NSString *bString = [cString substringWithRange:range]; // Scan values unsigned int r, g, b; [[NSScanner scannerWithString:rString] scanHexInt:&r]; [[NSScanner scannerWithString:gString] scanHexInt:&g]; [[NSScanner scannerWithString:bString] scanHexInt:&b]; return [UIColor colorWithRed:((float)r / 255.0f) green:((float)g / 255.0f) blue:((float)b / 255.0f) alpha:alpha]; } //默认alpha值为1 + (UIColor *)colorWithHexString:(NSString *)color { return [self colorWithHexString:color alpha:1.0f]; }
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size { CGRect rect = CGRectMake(0, 0, size.width, size.height); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }
//获取字符串的拼音 - (NSString *)phonetic { NSString *str = [self stringByReplacingOccurrencesOfString:@"-" withString:@" "]; NSMutableString *source = [str mutableCopy]; CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO); CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO); return source; }
//根据输入的NSString 取得首字母 (中文为拼音首字母) + (NSString*)getInitialsFromString:(NSString*)string { NSString *str = @""; if(string != nil && string.length > 0) { str = [[NSString stringWithFormat:@"%c",pinyinFirstLetter([string characterAtIndex:0])]uppercaseString]; NSString *userNameRegex = @"^[A-Z]$"; NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex]; BOOL B = [userNamePredicate evaluateWithObject:str]; if (B) { return str; }else { return @"#"; } } else { return @"#"; } }
//邮箱 + (BOOL) validateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:email]; } //手机号码验证 + (BOOL) validateMobile:(NSString *)mobile { //手机号以13, 15,18开头,八个 \d 数字字符 NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$"; NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex]; return [phoneTest evaluateWithObject:mobile]; } //车牌号验证 + (BOOL) validateCarNo:(NSString *)carNo { NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex]; NSLog(@"carTest is %@",carTest); return [carTest evaluateWithObject:carNo]; } //车型 + (BOOL) validateCarType:(NSString *)CarType { NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex]; return [carTest evaluateWithObject:CarType]; } //用户名 + (BOOL) validateUserName:(NSString *)name { NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$"; NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex]; BOOL B = [userNamePredicate evaluateWithObject:name]; return B; } //密码 + (BOOL) validatePassword:(NSString *)passWord { NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; return [passWordPredicate evaluateWithObject:passWord]; } //昵称 + (BOOL) validateNickname:(NSString *)nickname { NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; return [passWordPredicate evaluateWithObject:nickname]; } //身份证号 + (BOOL) validateIdentityCard: (NSString *)identityCard { BOOL flag; if (identityCard.length <= 0) { flag = NO; return flag; } NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$"; NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2]; return [identityCardPredicate evaluateWithObject:identityCard]; }
+ (NSString*)classString { return NSStringFromClass([self class]); }
使用他人代码中出现下面的警告,须要将该方法改成以下所示: interfaceOrientation is deprecated:first deprecated in ios8.0 [[UIApplication sharedApplication] statusBarOrientation]
1xx:信息响应类,表示接收到请求而且继续处理
2xx:处理成功响应类,表示动做被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动做,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求;
详细描述:状态码
在iOS开发中一般会遇到,两个靠的很近的按钮,一不当心两个按钮同时点击了。 神奇的bug就产生了,若是两个按钮事件都是跳转页面的话,就会出现连跳两个页面的状况。 一般解决此问题的方法是:定义一个BaseViewController。 设置一个方法setExclusiveTouchForButtons:(UIView *)myView
-(void)setExclusiveTouchForButtons:(UIView *)myView { for (UIView * v in [myView subviews]) { if([v isKindOfClass:[UIButton class]]) { [((UIButton *)v) setExclusiveTouch:YES]; } else if ( [v isKindOfClass:[UIView class]]) { [self setExclusiveTouchForButtons:v]; } } }
而后在viewDidDisappear中调用次方法。
- (void)viewDidDisappear:(BOOL)animated { [self setExclusiveTouchForButtons:self.view]; }
全部ViewController都继承这个BaseViewController就好了 或者使用运行时重写viewDidDisappear也能够。
dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD showWithStatus:@"正在清理缓存" maskType:SVProgressHUDMaskTypeClear]; }); dispatch_queue_t queue = dispatch_queue_create("cleanQueue", nil); dispatch_async(queue, ^{ NSFileManager *fileManager = [NSFileManager defaultManager]; //NSDate* begin = [NSDate date]; //__block NSError* error = nil; //获取Books的缓存 NSArray* subFiles = [fileManager subpathsAtPath:[NSString filePathDir]]; for (NSString* fileName in subFiles) { if ([[NSFileManager defaultManager]fileExistsAtPath:fileName]) { BOOL BOOL1 = [fileManager removeItemAtPath:[NSString filePathWithName:fileName] error:nil]; if (BOOL1) { } } } // 线程睡1秒 测试,实际用到是将下面代码删除便可 //[NSThread sleepForTimeInterval:1.0]; dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; }); }); }