第一天
從iOS9開(kāi)始的常見(jiàn)報(bào)錯(cuò)
Application windows are expected to have a root view controller at the end of application launch
- 從iOS9開(kāi)始, 在
程序啟動(dòng)完畢那一刻
顯示出來(lái)的窗口必須
要設(shè)置根控制器
應(yīng)用程序的圖標(biāo)
- 舊項(xiàng)目中的圖標(biāo)只要符合1個(gè)條件即可
- 圖片名叫做Icon.png
有些圖片顯示出來(lái)會(huì)自動(dòng)渲染成藍(lán)色
比如
- 設(shè)置tabBarItem的選中圖片
vc.tabBarItem.selectedImage = image;
- 設(shè)置UIButtonTypeSystem樣式按鈕的image時(shí)
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setImage:image forState:UIControlStateNormal];
解決方案
- 再次產(chǎn)生一張不會(huì)進(jìn)行渲染的圖片
// 加載圖片
UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];
// 產(chǎn)生一張不會(huì)進(jìn)行自動(dòng)渲染的圖片
UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.selectedImage = selectedImage;
-
直接在xcassets文件中配置
設(shè)置TabBarItem的文字屬性
- 直接設(shè)置每一個(gè)tabBarItem對(duì)象
// 普通狀態(tài)下的文字屬性
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[vc.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
// 選中狀態(tài)下的文字屬性
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[vc.tabBarItem setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
// 字典中用到的key
1.iOS7之前(在UIStringDrawing.h中可以找到)
- 比如UITextAttributeFont\UITextAttributeTextColor
- 規(guī)律:UITextAttributeXXX
2.iOS7開(kāi)始(在NSAttributedString.h中可以找到)
- 比如NSFontAttributeName\NSForegroundColorAttributeName
- 規(guī)律:NSXXXAttributeName
- 通過(guò)UITabBarItem的appearance對(duì)象統(tǒng)一設(shè)置
/**** 設(shè)置所有UITabBarItem的文字屬性 ****/
UITabBarItem *item = [UITabBarItem appearance];
// 普通狀態(tài)下的文字屬性
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
// 選中狀態(tài)下的文字屬性
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
項(xiàng)目的圖片資源
- 可以利用一個(gè)Mac軟件解壓
顏色相關(guān)的一些知識(shí)
- 顏色的基本組成
- 一種顏色由N個(gè)顏色通道組成
- 顏色通道
- 1個(gè)顏色通道占據(jù)8bit
- 1個(gè)顏色通道的取值范圍
- 10進(jìn)制 : [0, 255]
- 16進(jìn)制 : [00, ff];
- 常見(jiàn)的顏色通道
- 紅色 red R
- 綠色 green G
- 藍(lán)色 blue B
- 透明度 alpha A
- R\G\B一樣的是灰色
- 顏色的種類(lèi)
- 24bit顏色
- 由R\G\B組成的顏色
- 常見(jiàn)的表示形式
- 10進(jìn)制(
僅僅是用在CSS
)- 紅色 : rgb(255,0,0)
- 綠色 : rgb(0,255,0)
- 藍(lán)色 : rgb(0,0,255)
- 黃色 : rgb(255,255,0)
- 黑色 : rgb(0,0,0)
- 白色 : rgb(255,255,255)
- 灰色 : rgb(80,80,80)
- 16進(jìn)制(
可以用在CSS\android
)- 紅色 : #ff0000 #f00
- 綠色 : #00ff00 #0f0
- 藍(lán)色 : #0000ff #00f
- 黃色 : #ffff00 #ff0
- 黑色 : #000000 #000
- 白色 : #ffffff #fff
- 灰色 : #979797
- 10進(jìn)制(
- 32bit顏色
- 由R\G\B\A組成的顏色
- 常見(jiàn)的表示形式
- 10進(jìn)制(
僅僅是用在CSS
)- 紅色 : rgba(255,0,0,255)
- 綠色 : rgba(0,255,0,255)
- 藍(lán)色 : rgba(0,0,255,255)
- 黃色 : rgba(255,255,0,255)
- 黑色 : rgba(0,0,0,255)
- 白色 : rgba(255,255,255,255)
- 16進(jìn)制(#AARRGGBB,
僅僅是用在android
)- 紅色 : #ffff0000
- 綠色 : #ff00ff00
- 藍(lán)色 : #ff0000ff
- 黃色 : #ffffff00
- 黑色 : #ff000000
- 白色 : #ffffffff
- 10進(jìn)制(
- 24bit顏色
PCH文件可能引發(fā)的錯(cuò)誤
- 解決方案
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
/*** 如果希望某些內(nèi)容能拷貝到任何源代碼文件(OC\C\C++等), 那么就不要寫(xiě)在#ifdef __OBJC__和#endif之間 ***/
/***** 在#ifdef __OBJC__和#endif之間的內(nèi)容, 只會(huì)拷貝到OC源代碼文件中, 不會(huì)拷貝到其他語(yǔ)言的源代碼文件中 *****/
#ifdef __OBJC__
#endif
/***** 在#ifdef __OBJC__和#endif之間的內(nèi)容, 只會(huì)拷貝到OC源代碼文件中, 不會(huì)拷貝到其他語(yǔ)言的源代碼文件中 *****/
#endif
在Build Setting中配置宏
-
如果項(xiàng)目中有些宏找不到, 可能是配置在Build Setting中
注意點(diǎn):宏的名字不能全部是小寫(xiě)字母
-
如果宏的名字全部是小寫(xiě), 會(huì)出現(xiàn)以下錯(cuò)誤
第二天
控制臺(tái)可能會(huì)輸出以下警告信息
- 警告的原因: [UIImage imageNamed:nil]
CUICatalog: Invalid asset name supplied: (null)
CUICatalog: Invalid asset name supplied: (null)
- 警告的原因: [UIImage imageNamed:@""]
CUICatalog: Invalid asset name supplied:
CUICatalog: Invalid asset name supplied:
準(zhǔn)確判斷一個(gè)字符串是否有內(nèi)容
if (string.length) {
}
/*
錯(cuò)誤寫(xiě)法:
if (string) {
}
*/
替換UITabBarController內(nèi)部的tabBar
// 這里的self是UITabBarController
[self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];
center和size的設(shè)置順序
- 建議的設(shè)置順序
- 先設(shè)置size
- 再設(shè)置center
給系統(tǒng)自帶的類(lèi)增加分類(lèi)
- 建議增加的分類(lèi)屬性名\方法名前面加上前綴, 比如
@interface UIView (XMGExtension)
@property (nonatomic, assign) CGFloat xmg_width;
@property (nonatomic, assign) CGFloat xmg_height;
@property (nonatomic, assign) CGFloat xmg_x;
@property (nonatomic, assign) CGFloat xmg_y;
@property (nonatomic, assign) CGFloat xmg_centerX;
@property (nonatomic, assign) CGFloat xmg_centerY;
@property (nonatomic, assign) CGFloat xmg_right;
@property (nonatomic, assign) CGFloat xmg_bottom;
@end
按鈕常見(jiàn)的訪問(wèn)方法
[button imageForState:UIControlStateNormal].size;
button.currentImage.size;
[button backgroundImageForState:UIControlStateNormal];
button.currentBackgroundImage;
[button titleForState:UIControlStateNormal];
button.currentTitle;
[button titleColorForState:UIControlStateNormal];
button.currentTitleColor;
設(shè)置按鈕的內(nèi)邊距
@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR;
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
@property(nonatomic) UIEdgeInsets imageEdgeInsets;
解決導(dǎo)航控制器pop手勢(shì)失效
self.interactivePopGestureRecognizer.delegate = self;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 手勢(shì)何時(shí)有效 : 當(dāng)導(dǎo)航控制器的子控制器個(gè)數(shù) > 1就有效
return self.childViewControllers.count > 1;
}
第三天
frame和bounds的重新認(rèn)識(shí)
- frame
- 以
父控件
內(nèi)容
的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自己
矩形框
的位置和尺寸
- 以
- bounds
- 以
控件自己
內(nèi)容
的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自己
矩形框
的位置和尺寸
- 以
- 概括
- frame.size == bounds.size
- scrollView.bounds.origin == scrollView.contentOffset
bounds和frame的區(qū)別
矩形框和內(nèi)容的理解
- 矩形框
- 控件自己的顯示位置和尺寸
- 內(nèi)容
- 控件內(nèi)部的東西,比如它的子控件
在使用UITableViewController過(guò)程中,可能會(huì)出現(xiàn)的錯(cuò)誤
@interface TestTableViewController : UITableViewController
@end
'-[UITableViewController loadView] instantiated view controller with identifier "UIViewController-BYZ-38-t0r" from storyboard "Main", but didn't get a UITableView.'
- 造成這個(gè)錯(cuò)誤的原因
- 錯(cuò)誤地將一個(gè)UIViewController當(dāng)做UITableViewController來(lái)用
- 錯(cuò)誤做法
- 正確做法
contentInset的調(diào)整
- 默認(rèn)情況下, 如果一個(gè)控制器A處在導(dǎo)航控制器管理中, 并且控制器A的第一個(gè)子控件是UIScrollView, 那么就會(huì)自動(dòng)調(diào)整這個(gè)UIScrollView的contentInset
- UIEdgeInsetsMake(64, 0, 0, 0) // 有導(dǎo)航欄
- UIEdgeInsetsMake(20, 0, 0, 0) // 沒(méi)有導(dǎo)航欄
- 默認(rèn)情況下, 如果一個(gè)控制器A處在導(dǎo)航控制器管理中, 并且導(dǎo)航控制器又處在UITabBarController管理中, 并且控制器A的第一個(gè)子控件是UIScrollView, 那么就會(huì)自動(dòng)調(diào)整這個(gè)UIScrollView的contentInset
- UIEdgeInsetsMake(64, 0, 49, 0)
- 如何禁止上述的默認(rèn)問(wèn)題?
控制器A.automaticallyAdjustsScrollViewInsets = NO;
文字內(nèi)容換行
- 如何讓storyboard\xib中的文字內(nèi)容換行
- 快捷鍵: option + 回車(chē)鍵
- 在storyboard\xib輸入\n是無(wú)法實(shí)現(xiàn)換行的
- 在代碼中輸入\n是可以實(shí)現(xiàn)換行的
self.label.text = @"534534534\n5345345\n5345";
修改狀態(tài)欄樣式
-
使用UIApplication來(lái)管理
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
在Info.plist中做了圖中的配置,可能會(huì)出現(xiàn)以下警告信息
- 使用UIViewController來(lái)管理
@implementation XMGLoginRegisterViewController
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
@end