1、設置導航欄標題的字體顏色和大小 方法一:(自定義視圖的方法,一般人也會採用這樣的方式) 就是在導航向上添加一個titleView,可以使用一個label,再設置label的背景顏色透明,字體什麼的設置就很簡單了。 //自定義標題視圖 UILabel *titleLabel = [[UILabel ...
1、設置導航欄標題的字體顏色和大小
方法一:(自定義視圖的方法,一般人也會採用這樣的方式)
就是在導航向上添加一個titleView,可以使用一個label,再設置label的背景顏色透明,字體什麼的設置就很簡單了。
//自定義標題視圖 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 44)]; titleLabel.backgroundColor = [UIColor grayColor]; titleLabel.font = [UIFont boldSystemFontOfSize:20]; titleLabel.textColor = [UIColor greenColor]; titleLabel.textAlignment = NSTextAlignmentCenter; titleLabel.text = @"新聞"; self.navigationItem.titleView = titleLabel;View Code
方法二:(在預設顯示的標題中直接修改文件的大小和顏色也是可以的)
[self.navigationController.navigationBar setTitleTextAttributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:19], NSForegroundColorAttributeName:[UIColor redColor] } ]View Code
2、多容器添加同一子控制項的bug
[someView addSubView:sbView];
那麼在被添加到父視圖someView之前,如果sbView已經被otherView載入了,那麼上面的代碼會先講sbView從otherView remove掉,在被載入到someView。
所以一個view是不可能同時被2個以上的view載入做子視圖的。
3、返回根控制器
- (void)dismissToRootViewController:(UIViewController *)viewController{ if (viewController.presentingViewController == nil) { [viewController.navigationController popToRootViewControllerAnimated:NO]; }else{ UIViewController *vc = viewController.presentingViewController; while (vc.presentingViewController != nil) { vc = vc.presentingViewController; } [vc dismissViewControllerAnimated:NO completion:nil]; } }View Code
4、獲取照片拍攝地點信息
- (NSDictionary *)metadata { return self.asset.defaultRepresentation.metadata; } - (CLGeocoder *)geoC { if(!_geoC){ _geoC = [[CLGeocoder alloc] init]; } return _geoC; } - (void)addressInit{ // 獲取位置信息 NSDictionary *metadata = [self metadata]; NSDictionary *GPSDict=[metadata objectForKey:(NSString*)kCGImagePropertyGPSDictionary]; // 經緯度 CLLocationDegrees latitude = [[GPSDict objectForKey:@"Latitude"] doubleValue]; CLLocationDegrees longitude = [[GPSDict objectForKey:@"Longitude"] doubleValue]; CLLocation *loc = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; WEAKSELF // 反地理編碼 [self.geoC reverseGeocodeLocation:loc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { CLPlacemark *pl = [placemarks firstObject]; if(error == nil){ NSString *str = [NSString stringWithFormat:@"%@%@%@",pl.locality, pl.subLocality, pl.name]; weakSelf.address = str; } else{ weakSelf.address = @""; } }]; }View Code
5、隨機數 隨機色
Objective-C 中有個arc4random()函數用來生成隨機數且不需要種子,
但是這個函數生成的隨機數範圍比較大,需要用取模的演算法對隨機值進行限制,有點麻煩。
更方便的隨機數函數arc4random_uniform(x),
可以用來產生0~(x-1)範圍內的隨機數,不需要再進行取模運算。
如果要生成1~x的隨機數,可以這麼寫:arc4random_uniform(x)+1
隨機色:
#define random(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0alpha:(a)/255.0] #define randomColor random(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256)) [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1];View Code
6、退出app
AppDelegate *app = [UIApplication sharedApplication].delegate; UIWindow *window = app.window; [UIView animateWithDuration:0.4f animations:^{ window.alpha = 0; CGFloat y = window.bounds.size.height; CGFloat x = window.bounds.size.width / 2; window.frame = CGRectMake(x, y, 0, 0); } completion:^(BOOL finished) { exit(0); }];View Code
7、移除導航條按鈕
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd]; button.frame = CGRectMake(0, 0, 30, 30); UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.leftBarButtonItem = barButton; #if 0 //第一種 self.navigationItem.leftBarButtonItem = nil; #else //第二種 [self.navigationController.navigationBar.subviews.lastObject setHidden:YES]; #endifView Code
8、隱藏導航欄下劃線
// 1)聲明UIImageView變數,存儲底部橫線 @implementation MyViewController { UIImageView *navBarHairlineImageView; } // 2)在viewDidLoad中加入: navBarHairlineImageView = [self findHairlineImageViewUnder:navigationBar] // 3) - (UIImageView *)findHairlineImageViewUnder:(UIView *)view { if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) { return (UIImageView *)view; } for (UIView *subview in view.subviews) { UIImageView *imageView = [self findHairlineImageViewUnder:subview]; if (imageView) { return imageView; } } return nil; } // 最後在viewWillAppear,viewWillDisappear中處理 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; navBarHairlineImageView.hidden = YES; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; navBarHairlineImageView.hidden = NO; } WEAKSELF static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [weakSelf.navigationController.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:NSClassFromString(@"_UIBarBackground")]) { [obj.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[UIImageView class]]) { [obj setHidden:YES]; } }]; } }]; });View Code
9、translucent 與 controller.view
translucent = NO;
translucent = YES;
10、禁用第三方輸入法
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString*)extensionPointIdentifier { return NO; }View Code
11、UIView截屏
/* UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); // Render the view [view.layer renderInContext:context]; // Get the image from the context UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext(); // Cleanup the context you created UIGraphicsEndImageContext(); return renderedImage; */ + (UIImage *)snapShotFrom:(UIView *)view{ // 避免frame為nil導致異常 if (CGRectIsEmpty(view.frame)) { return nil; } UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0.0); if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; } else{ // 占用記憶體高 引起異常 [view.layer renderInContext:UIGraphicsGetCurrentContext()]; } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }View Code
當視圖快速切換時的崩潰
這個崩潰是使用了while迴圈連續截屏100次webview發現的,崩潰為EXE_BAD_ACCESS
原因是afterScreenUpdates設置為了YES.
為什麼會崩潰呢? 因為設置為YES後,這些方法會等在view update結束在執行,如果在update結束前view被release了,會出現找不到view的問題.所以需要設置為NO.
12、XCODE調試時不顯示變數值/指針地址的解決方案
1.Scheme中run裡面確保設成debug
2.build settings-搜索optim,確保是-O0
3.build settings-搜索-O2,改成-g。這項最坑爹,好像是預設的設置成-O2的
13、比較兩個圖片是否相同
1.如果2張圖片都被載入都resource中,而且圖片名稱已知,使用imageNamed:創建2個UIImage對象就好,然後用isequal去比較。
2.兩張圖片存儲在ios沙盒的某個位置,未被載入到resource中,比較兩個UIImage的data,看看是否相同。
NSString* file = [dic stringByAppendingPathComponent:path]; UIImage *image = [UIImage imageWithContentsOfFile:file]; NSData *data1 = UIImagePNGRepresentation(image1); NSData *data = UIImagePNGRepresentation(image); if ([data isEqual:data1]) { NSLog(@"is equae"); }View Code
14、UITableView間隔、顏色
要想改變其seperator的高度,是做不到的
首先,我們將其sperator設置為none。
其次,我們在構建tableview的時候,使用多secton,每個section中僅有一個row的方式構建。
第三,設置每個section的headerView的高度為要求的高度。
第四,重新定製每一個section的headerView,設置section的背景顏色為指定的顏色。
代碼如下:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, height)]; //height為設計師制定的高度。 view.backgroundColor = [UIColor redColor]; return view; }View Code
15、實時檢測UITextField的變化
使用UISearchBar,UISearchBar的內容動態改變的時候,我們是可以通過代理來獲知這個改變的。
在使用UITextField的時候,沒有合適的代理函數,使用註冊通知。
// 1,在initWithNibName中註冊對應的通知: - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:_passwordTextField]; } return self; } // 2,實現textFieldChanged函數 - (void)textFieldChanged:(id)sender { NSLog(@"current ContentOffset is %@",NSStringFromCGPoint(_contentView.contentOffset)); } // 3,記得在dealloc中刪除掉通知。 - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil]; }View Code
16、UITextField加陰影
UITextView輸入的時候,文字下麵有陰影,系統預設只有UILabel有幾個簡單的介面可以設陰影,
至於UITextView的陰影就基本上沒人用了,給UITextView的文字加陰影的辦法,即通過layer層來設置。
上代碼
請記得加入 QuartzCore.framework。
View Code
17、判斷程式第一次啟動
View Code
18、查看UUID
1.查看 xx.app 文件的 UUID,terminal 中輸入命令 :
·dwarfdump --uuid xx.app/xx (xx代表你的項目名)
2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中輸入命令:
·dwarfdump --uuid xx.app.dSYM
3.crash 文件內第一行 Incident Identifier 就是該 crash 文件的 UUID。
19、禁用手勢
<UIGestureRecognizerDelegate> self.navigationController.interactivePopGestureRecognizer.delegate = self; - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ return NO; }View Code
20、NSString對UTF-8編碼解碼
// iOS中對字元串進行UTF-8編碼:輸出str字元串的UTF-8格式 [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 解碼:把str字元串以UTF-8規則進行解碼 [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];View Code
21、手勢與tableview事件衝突處理
// 在view上添加tag手勢的時候,並且設置tag事件的代理 //然後根據具體的業務場景去寫邏輯就可以了,比如 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { //Tip:我們可以通過列印touch.view來看看具體點擊的view是具體是什麼名稱,像點擊UITableViewCell時響應的View則是UITableViewCellContentView. if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) { //返回為NO則屏蔽手勢事件 return NO; } return YES; }View Code
22、ScrollView header懸停
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.y >= 50) { self.header.frame = CGRectMake(0, 0, 375, 35); [self.view addSubview:self.header]; } else { self.header.frame = CGRectMake(0, 50, 375, 35); [self.scrollView addSubview:self.header]; } }View Code
23、從設備支持的字體中隨機選擇一個
// 從設備支持的字體中隨機選擇一個 NSString *fontName = @""; NSUInteger count1 = arc4random() % ([UIFont familyNames].count); NSString *familyName = [UIFont familyNames][count1]; NSUInteger count2 = [UIFont fontNamesForFamilyName:familyName].count; fontName = [UIFont fontNamesForFamilyName:familyName][arc4random() % count2];View Code
24、UIFont 轉 CGFontRef
// 創建 UIFont 字體 UIFont *font = [UIFont systemFontOfSize:15]; // 轉換成 CGFontRef CFStringRef fontName = (__bridge CFStringRef)font.fontName; CGFontRef fontRef = CGFontCreateWithFontName(fontName);View Code
25、字元串轉日期失敗 NSDataFormatter 格式設置:
//You're using the wrong formatter: NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy"]; NSDate *startDatePlain=[formatter dateFromString:start]; NSDate *endDatePlain=[formatter dateFromString:end]; //You need to use your detailformatter: NSDateFormatter *detailformatter = [[NSDateFormatter alloc] init]; [detailformatter setDateFormat:@"MM/dd/yyyy"]; NSDate *startDatePlain=[detailformatter dateFromString:start]; NSDate *endDatePlain=[detailformatter dateFromString:end]; //You've got the correct format set on detailformatter!View Code