iOS 開發常常遇到的注意要點集合

iOS 開發常常遇到的注意要點集合

iOS如何把全部界面的狀態欄的字體顏色都設置爲白色

第一步:在info.plist中添加一個字段:view controller -base status bar 設置爲NOcss

第二步:在一個全部界面都繼承的父類裏添加:ios

if (IOS7_OR_LATER) { // 判斷是不是IOS7

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];

  }

OC字符串過濾特殊字符

NSString *tempstring = [dic objectForKey:key];//@"[]{}(#%-*+=_)\\|~(<>$%^&*)_+ "

NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"@¥"];

tempstring = [[tempstring componentsSeparatedByCharactersInSet:doNotWant]componentsJoinedByString:@""];

關於網絡請求設置代理後可能會致使崩潰的問題 ||ios中代理爲何要用weak修飾

在代理中,其實也不是用weak來修飾。在MRC的時候是用assign來修飾,在ARC以後用unsafe_unretained,做用是跟weak相似的。主要是爲了防止循環引用。好比A引用了B,B引用了C,C又引用了A,這樣循環引用以後,若是用strong強引用來修飾,這個代理就永遠釋放不掉了。git

tableview 刷新後 顯示到第一行

[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];

MesaSQLite能夠創做、設計、修改一個SQLite3數據庫,也被用於編輯、總結、分析客戶數據。

官網下載地址: 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]; } } 

 

Xcode 真機調試中"There was an internal API error"錯誤解決方法

應該是product name名字是中文才出現的問題(算是xcode的bug麼?),解決辦法:把product name中的名字改爲英文(app的名字若是是中文的,但是在plist中的Bundle display name設置中文,這並不會影響)

UITextView: 響應鍵盤的 return 事件

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;
}

UIViewAnimationOptions的類型

常規動畫屬性設置(能夠同時選擇多個進行設置)

UIViewAnimationOptionLayoutSubviews:動畫過程當中保證子視圖跟隨運動。

UIViewAnimationOptionAllowUserInteraction:動畫過程當中容許用戶交互。

UIViewAnimationOptionBeginFromCurrentState:全部視圖從當前狀態開始運行。

UIViewAnimationOptionRepeat:重複運行動畫。

UIViewAnimationOptionAutoreverse :動畫運行到結束點後仍然以動畫方式回到初始點。

UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套動畫時間設置。

UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套動畫速度設置。

UIViewAnimationOptionAllowAnimatedContent:動畫過程當中重繪視圖(注意僅僅適用於轉場動畫)。

UIViewAnimationOptionShowHideTransitionViews:視圖切換時直接隱藏舊視圖、顯示新視圖,而不是將舊視圖從父視圖移除(僅僅適用於轉場動畫) UIViewAnimationOptionOverrideInheritedOptions :不繼承父動畫設置或動畫類型。

2.動畫速度控制(可從其中選擇一個設置)

UIViewAnimationOptionCurveEaseInOut:動畫先緩慢,而後逐漸加速。

UIViewAnimationOptionCurveEaseIn :動畫逐漸變慢。

UIViewAnimationOptionCurveEaseOut:動畫逐漸加速。

UIViewAnimationOptionCurveLinear :動畫勻速執行,默認值。

3.轉場類型(僅適用於轉場動畫設置,能夠從中選擇一個進行設置,基本動畫、關鍵幀動畫不須要設置)

UIViewAnimationOptionTransitionNone:沒有轉場動畫效果。

UIViewAnimationOptionTransitionFlipFromLeft :從左側翻轉效果。

UIViewAnimationOptionTransitionFlipFromRight:從右側翻轉效果。

UIViewAnimationOptionTransitionCurlUp:向後翻頁的動畫過渡效果。

UIViewAnimationOptionTransitionCurlDown :向前翻頁的動畫過渡效果。

UIViewAnimationOptionTransitionCrossDissolve:舊視圖溶解消失顯示下一個新視圖的效果。

UIViewAnimationOptionTransitionFlipFromTop :從上方翻轉效果。

UIViewAnimationOptionTransitionFlipFromBottom:從底部翻轉效果

拍完照把照片寫入到iOS自帶相冊裏面

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

iOS識別16進制顏色表方法

+ (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;
}

iOS獲取字符串的拼音

//獲取字符串的拼音
- (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 取得首字母 (中文爲拼音首字母)
+ (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 @"#";
    }
}

iOS經常使用的正則表達式

//郵箱
+ (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];
}

oc中取類名

+ (NSString*)classString {
    return NSStringFromClass([self class]);
}

解決interfaceOrientation is deprecated:first deprecated in ios8.0

使用他人代碼中出現下面的警告,須要將該方法改成以下所示:
interfaceOrientation is deprecated:first deprecated in ios8.0
[[UIApplication sharedApplication] statusBarOrientation]

請求響應消息

1xx:信息響應類,表示接收到請求而且繼續處理

2xx:處理成功響應類,表示動做被成功接收、理解和接受

3xx:重定向響應類,爲了完成指定的動做,必須接受進一步處理

4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行

5xx:服務端錯誤,服務器不能正確執行一個正確的請求;

詳細描述:狀態碼

iOS中防止兩個按鈕同時點擊的方法

在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];
                        });
                    });
                }
相關文章
相關標籤/搜索