第一步:在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]; }); }); }