iOS Tips 小貼

一銘發表於2017-12-13

1.NSDate 取年月日等等 最近專案中要取到當前時間的年月日等等資料,搜遍終得一個方法如下:

- (void)setDateArray
{
    NSDate *dateNow;
    for (int i = 0; i<7; i++) {
        dateNow = [NSDate dateWithTimeIntervalSinceNow:i*24*60*60];
        NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *comps = [[NSDateComponents alloc]init];
        NSInteger unitFlags = NSYearCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit|NSHourCalendarUnit |NSMonthCalendarUnit;
        comps = [calendar components:unitFlags fromDate:dateNow];
        long day = [comps day];
        NSUInteger month = [comps month];
        NSString *dateStr = [NSString stringWithFormat:@"%ld月%ld日",month,day];
        [_dateArray addObject:dateStr];
    }
}
複製程式碼

輸出_dataArray 可得

**12****月****14****日**
**12****月****15****日**
**12****月****16****日**
**12****月****17****日**
**12****月****18****日**
**12****月****19****日**
**12****月****20****日**
複製程式碼
  1. xcode 7 tableView的一些小問題

tableView 在xcode7 下會有一些分割線無法被隱藏 解決辦法:

-(void)layoutSubviews{
      [super layoutSubviews]; 
       self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
複製程式碼
  1. reloadData 重新整理失效
[tableView reloadData]
複製程式碼

無效,有一行 cell 明明改變了但是重新整理不出來。 解決的方法是,註釋 [tableView reloadData] ,改用區域性重新整理:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
複製程式碼

4.測試 bug 的工具 bugtags 用了不後悔

/**
 *  判斷一個時間段有幾天幾個小時幾分鐘等等
 *
 *  @param startDate 開始日期
 *  @param endDate   結束時間
 *
 *  @return 返回兩個時間段中間差幾個小時
 */
+ (NSString *)getStartTime:(NSString *)startDate endTime:(NSString *)endDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"HH:mm"];
    
    NSDate *date1 = [dateFormatter dateFromString:startDate];
    NSDate *date2 = [dateFormatter dateFromString:endDate];
    
    NSTimeInterval time = [date2 timeIntervalSinceDate:date1];
    float hours = (float)time/3600;
    return [NSString stringWithFormat:@"%.2f",hours];
}

/**
 *  判斷一個時間段內有幾個星期幾 (比如判斷1月29號到2月12號有幾個星期五)
 *
 *  @param startDate 開始時間
 *  @param endDate   結束時間
 *  @param weekStr   判斷的星期幾
 *
 *  @return  nsstring 是個數
 */
- (NSString *)featureWeekdayWithDate:(NSString *)startDate endStart:(NSString *)endDate weekStr:(NSString *)weekStr
{
    NSInteger dayIndex = 0;
    if ([weekStr isEqualToString:@"星期天"]) {
        dayIndex = 7;
    }
    if ([weekStr isEqualToString:@"星期一"]) {
        dayIndex = 1;
    }
    if ([weekStr isEqualToString:@"星期二"]) {
        dayIndex = 2;
    }
    if ([weekStr isEqualToString:@"星期三"]) {
        dayIndex = 3;
    }
    if ([weekStr isEqualToString:@"星期四"]) {
        dayIndex = 4;
    }
    if ([weekStr isEqualToString:@"星期五"]) {
        dayIndex = 5;
    }
    if ([weekStr isEqualToString:@"星期六"]) {
        dayIndex = 6;
    }
    
    long days = [[MyUtil getStartTime:startDate endTime:endDate] integerValue];
    days++;
    // 將總天數 換算為 以 周 計算(假如 相差10天,其實就是等於 相差 1周零3天,只需要取3天,更加方便計算)
    NSInteger fullIndex = days>=7 ? days/7 : 0;
    long day = days >= 7 ? days % 7 : days;
    NSInteger flag = 0;
    for (int i = 0; i< day; i++) {
        NSDate *date = [NSDate dateWithString:startDate format:@"yyyy-MM-dd"];
        long week = ([date weekday]+i)%7;
        switch (week) {
            case 1:
                if (dayIndex == 7) {
                    flag++;
                }
                break;
            case 2:
                if (dayIndex == 1) {
                    flag++;
                }
                break;
            case 3:
                if (dayIndex == 2) {
                    flag++;
                }
                break;
            case 4:
                if (dayIndex == 3) {
                    flag++;
                }
                break;
            case 5:
                if (dayIndex == 4) {
                    flag++;
                }
                break;
            case 6:
                if (dayIndex == 5) {
                    flag++;
                }
                break;
            case 7:
                if (dayIndex == 6) {
                    flag++;
                }
                break;
            default:
                break;
        }
    }
    return [NSString stringWithFormat:@"%d",fullIndex+flag];
}
複製程式碼

設定一個 UIView 的背景圖片:推薦使用

 NSString *path = [[NSBundlemainBundle]pathForResource:@"image"ofType:@"jpg"];      
 UIImage *image = [UIImageimageWithContentsOfFile:path];
 self.view.layer.contents = (id)image.CGImage;
複製程式碼

圖片快取 根據是否將建立好的物件快取入系統記憶體,有兩類建立UIImage物件的方法可選:

快取:+ imageNamed:,只需傳入檔名.副檔名(可選)即可。 不快取:+ imageWithContentsOfFile:,必須傳入檔案的全名(全路徑+檔名)。

Assets.xcassets中的圖片資源只能通過imageNamed:方法載入,通過NSBundle的pathForResource:ofType:無法獲得圖片路徑。因此,Assets.xcassets只適合存放系統常用的,佔用記憶體小的圖片資源。 imageNamed:方法同樣可以載入根目錄中的圖片資源。 要想利用imageWithContentsOfFile:方法以不快取的形式載入圖片,必須將圖片資源放置在根目錄中。

相關文章