0##技術點1:下面圖片被選中的圖片應該是棕橙色,為什么是藍色??怎么做??
UIViewController *vc1 = [[UIViewController alloc]init];
//自己設置的一個隨機色
vc1.view.backgroundColor = CWRandomColor;
vc1.tabBarItem.title = @"首頁";
vc1.tabBarItem.image = [UIImage imageNamed:@"tabbar_home"];
vc1.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected"];
解決辦法:以第一個首頁為例,
1.tabBarItem有這樣一個情況:如果你把一個普通的圖片給selectedImage,在選中的時候自動渲染成藍色,下面咱們就需要阻止它渲染
2.主要采用一個方法,不讓它進行渲染(下面的圖片返回值為一張圖片直接給選中之后就好了)-
(UIImage*)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);
UIViewController *vc1 = [[UIViewController alloc]init]; //自己設置的一個隨機色 vc1.view.backgroundColor = CWRandomColor; vc1.tabBarItem.title = @"首頁"; vc1.tabBarItem.image = [UIImage imageNamed:@"tabbar_home"]; //聲明這張圖片按照原始的樣子顯示出來,不要自動渲染成其他顏色(比如藍色) vc1.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_home_selected"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];//原始的,原來的樣子
感悟:遇到問題可以到官方文檔進行搜,還可以進行一些網(wǎng)站進行搜索,下面提供一些方法
(1)官方搜索答案,比如這里的搜索UIImage看看有沒有新的功能,你會有不少的收獲。(2)百度搜索。(3)外國網(wǎng)站:stackoverflow(需要翻墻進入),這個是一個專業(yè)的IT網(wǎng)站(十個問題八個在這里都可以被解決掉)。特點是:全英文,由此可見學好英文很重要。
技術點2:如何改變上面字體的顏色呢??
解決辦法:系統(tǒng)的方法:要的式字典
-(void)setTitleTextAttributes:(nullable NSDictionary<NSString*,id>*)attributes forState:(UIControlState)state NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
改變字體的樣式(兩種,選中和沒有選中)
NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = [UIColor blackColor];關鍵步驟
[vc1.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
NSMutableDictionary *selectedtextAttrs = [NSMutableDictionary dictionary];
selectedtextAttrs[NSForegroundColorAttributeName] = [UIColor orangeColor];
[vc1.tabBarItem setTitleTextAttributes:selectedtextAttrs forState:UIControlStateSelected];
技術點3 微博分欄里面的灰色不是我想要的,我要改變未選中狀態(tài)的顏色怎么辦???
解決辦法:采用取色計來取色,蘋果電腦spotlight搜索color,雙擊即可,鼠標點在哪里哪里的RGB就會顯示出來
技術點4:遇到很多的相同代碼怎么辦???
解決辦法:
很多重復的代碼->將重復的代碼抽取到一個方法中
1.相同的代碼放到一個方法中
2.不同的東西變成參數(shù)
3.在使用這段代碼的地方調(diào)用
下面展示代碼的優(yōu)化:(調(diào)用方法來減少相同的代碼,提高傳參的高效性)
//RGB顏色(255后面一定要有“.0”,切記)
#define CWColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0];
//隨機色
#define CWRandomColor CWColor(arc4random_uniform(256),arc4random_uniform(256),arc4random_uniform(256))
設置子控制器(4個子控制器)(添加導航控制器只需要在下面方法里面添加導航控制器,讓傳進來的控制器作為其根控制器,把導航控制器的對象添加到tabBar里面)最后就是這樣一個模塊
CWHomeTableViewConreoller *homeVc = [[CWHomeTableViewConreoller alloc]init];
[self addChildVc:homeVc Title:@"首頁" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];
CWMessageTableViewController *messageVc = [[CWMessageTableViewController alloc]init];
[self addChildVc:messageVc Title:@"消息" image:@"tabbar_message_center" selectedImage:@"tabbar_message_center_selected"];
CWDiscoverTableViewController *discverVc = [[CWDiscoverTableViewController alloc]init];
[self addChildVc:discverVc Title:@"發(fā)現(xiàn)" image:@"tabbar_discover" selectedImage:@"tabbar_discover_selected"];
CWProfileTableViewController *profileVc =[[CWProfileTableViewController alloc]init];
[self addChildVc:profileVc Title: @"我" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];
-(void)addChildVc:(UIViewController *)childVc Title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
//自己設置的一個隨機色
childVc.view.backgroundColor = CWRandomColor;
childVc.tabBarItem.title = title;
childVc.tabBarItem.image = [UIImage imageNamed:image];
//聲明這張圖片按照原始的樣子顯示出來,不要自動渲染成其他顏色(比如藍色)
childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];//原始的,原來的樣子
//改變字體的樣式(兩種,選中和沒有選中)
NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = CWColor(123, 123, 123);
[childVc.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
NSMutableDictionary *selectedtextAttrs = [NSMutableDictionary dictionary];
selectedtextAttrs[NSForegroundColorAttributeName] = [UIColor orangeColor];
[childVc.tabBarItem setTitleTextAttributes:selectedtextAttrs forState:UIControlStateSelected];
}
技術點5:怎么讓跳轉(zhuǎn)頁面tabBar隱藏???重點來了:怎么讓下一個控制器的tabBar隱藏,而不影響上一個控制器的tabBar(強烈推薦使用第一種)
-
解決辦法:講3種(后兩種效果不好會影響前后的界面的tabBar隱藏與否)
第一種:(把下面代碼放到跳轉(zhuǎn)頁面):hidesBottomBarWhenPushedCWTestViewController *testViewController = [[CWTestViewController alloc]init];//下一個控制器的實例化
>//當testViewController控制器被push的時候,testViewController所在的tabBarController的tabbar會自動隱藏
//當testViewController控制器被pop的時候,testViewController所在tabBarController的tabBar就會自動顯示
> testViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:testViewController animated:YES];
第二種:(把下面代碼放到跳轉(zhuǎn)頁面)
self.tabBarController.tabBar.hidden = YES ;
第三種:把代碼寫在將要跳轉(zhuǎn)的控制器里面寫上
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tabBarController.tabBar.hidden = YES ;
}
技術點6:在我們進行push切換控制器的時候怎么解決導航欄標題長的問題???
- 比如下面的“消息”這個標題,當進入第二個控制器的時候如果它很長,怎么解決???以及后面更多的控制器又要怎么解決
解決辦法:(系統(tǒng)的方法不能給backBarButtonItem)
- 1.新建一個繼承于UIViewController的類 ,在它的ViewDidLoad里面寫上下面的代碼,讓其他的控制器繼承于它,而UITabViewController不能繼承與它,這樣表視圖的下一個控制器就無法設置自定義的“返回”;
backBarButtonItem只接受字體的賦值,比如說“返回”,其他的比如說圖片,系統(tǒng)的button都不接受
//建一個普通的的button給導航欄的 self.navigationItem.backBarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(click)];
self.navigationItem.backBarButtonItem = backItem;
- 2.對于上面的問題作出了如下的解決辦法
在UITabViewController類的里面單獨設置下一個控制器的返回按鈕,也就是上面的代碼在表視圖的控制器里面再寫一遍。
擴展:有關導航欄上UIButtonItem的各類設置(button的添加)
- 1 設置一個自定義的button放在NavigationBar上:使后面的控制器都變?yōu)榉祷?/strong>
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(click)];
//第一:把自定義的button給系統(tǒng)的返回按鈕
self.navigationItem.backBarButtonItem = backItem;
//第二:隨意放在左右兩個位置
self.navigationItem.leftBarButtonItem = backItem;
self.navigationItem.rightBarButtonItem = backItem;
-(void)click
{
NSLog(@"實現(xiàn)什么功能以及其他的什么自己就設置");
}
-
2.系統(tǒng)的buttonItem(不可以隨便放)
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(click)];
第一:不能給backBarButtonItem
第二:可以設置左右位置和上面的一樣 3.設置一個自定義的圖片作為返回按鈕??????難點???待解決
解決辦法:建類來繼承,效果和代碼均如下
特別強調(diào)圖片渲染的問題(在此又產(chǎn)生了一個問題:怎么讓選中的左右兩個按鈕在選中的情況下都是高亮的狀態(tài)???在下面技術點七講解)
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"navigationbar_back"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(click)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"navigationbar_more"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(clickMore)];
}
-(void)click
{
[self.navigationController popViewControllerAnimated:YES];
}
技術點7:上個問題的遺留??導航欄上點住高亮如何設置???(也是切換圖片)
- 解決辦法:新建button,坑:(1.自定義的button一定要設置size,2.方法是setBackgroundImage,不再是setImage,,如過不用切換圖片則initWithImage即可,3.button大小的設置,)
代碼如下:(添加多張圖片要選擇initWithCustomView)
//設置圖片
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[backBtn addTarget:self action:@selector(clickBack) forControlEvents:UIControlEventTouchUpInside];
[backBtn setBackgroundImage:[UIImage imageNamed:@"navigationbar_back"] forState:UIControlStateNormal];
[backBtn setBackgroundImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] forState:UIControlStateHighlighted];
//設置尺寸
CGSize size = backBtn.currentBackgroundImage.size;
backBtn.frame = CGRectMake(0, 0, size.width, size.height);
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backBtn];
技術點8: 上面兩個技術點在單個控制器和部分控制器可以適用,但是在“繼承的時候”跳轉(zhuǎn)到一些其他控制器就不適合了???
問題分析:(控制器就不要繼承了)
以后在遇到UIController就不要再考慮繼承的問題了,因為繼承本身是有問題的;比如說進入TableViewController的類(tableView 就不存在了)解決辦法
統(tǒng)一所有控制器導航欄左上角和右上角的內(nèi)容(最好的方法)
(1) 讓所有push進來的控制器,它導航欄左上角和右上角的內(nèi)容一樣(類似返回按鈕)。
(2) 攔截所有push進來的控制器。
(3) 方案:自定義導航控制器重寫push的方法就可得到傳進來的控制器參數(shù)。
方法:
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
具體的操作寫在這里( )
重點提一下:
1. 每次控制器push的時候都會來到這里,而這里的viewController 代表那個控制器的對象
2. self.viewControllers.count 代表在導航控制器里面的控制器個數(shù)
3. self 在這里代表 單個控制器里面的self.navigationController
}
技術點9:如何消除tabView 左邊有空格的問題???
方法如下:
- (void)viewDidLoad {
[super viewDidLoad];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
- (void)tableView:(UITableView *)tableView willDisplayCell: (UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
技術10:怎么把一個一個方法封裝起來???
分析:下面是一個方法
-(UIBarButtonItem *)setbutton:(NSString *)backImage BackHighlightedImage:(NSString *)backHighlightedImage action:(SEL)action
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
[button setBackgroundImage:[UIImage imageNamed:backImage] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:backHighlightedImage] forState:UIControlStateHighlighted];
CGSize size = button.currentBackgroundImage.size;
button.frame =CGRectMake(0, 0, size.width, size.height);
return [[UIBarButtonItem alloc]initWithCustomView:button];
}
解決辦法:建一個類進行封裝 繼承于 NSObject ,分別聲明和實現(xiàn),把減號(-)改為加號(+);有坑:里面的SE不能實現(xiàn),解決辦法:把調(diào)用的控制器也傳進來作為參數(shù)Target:(id)target ,注意里面方法選擇器的參數(shù)如何設置???
- 如截圖:不要害怕,我只是改動很小,看上面的解決辦法
重點可以把上面的進行建立分類,增加方法
- 把建好的分類導入到pch文件里面(再調(diào)用的話就不再用類名了,而是UIBarButtonItem)
技術點11.怎么設置導航欄右上角字體的顏色??
- 分析:系統(tǒng)默認渲染成藍色。要想設置我們所需要的顏色需要尋找方法。
- 解決辦法:正常狀態(tài)下咱們根據(jù)需要設置顏色,如果在點擊設置應該是organge顏色。因為需要設置主題色,所以就在導航欄里面設置所有的字體顏色,下面的方法放在導航控制器的.m里面
/*
設置導航欄文字的顏色以及文字大?。ㄈ鐚Ш降谋尘邦伾约皩Ш綑谥虚g字體的顏色)
[UINavigationBar appearance];
設置Item的樣式
[UIBarButtonItem appearance];
*/
//在第一次使用調(diào)用一次(tabBar的個的控制器navigationController寫下面的方法)
+(void)initialize
{
//設置整個項目所有item的主題樣式()
UIBarButtonItem *item = [UIBarButtonItem appearance];
//設置普通狀態(tài)的字體顏色和大小
NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = CWColor(123, 123, 123);
textAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:22];
[item setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
//設置點擊的時候顏色和大小
NSMutableDictionary *textAttrsSeleced = [NSMutableDictionary dictionary];
textAttrsSeleced[NSForegroundColorAttributeName] = CWColor(252, 108, 8);
textAttrsSeleced[NSFontAttributeName] = [UIFont systemFontOfSize:22];
[item setTitleTextAttributes:textAttrsSeleced forState:UIControlStateSelected];
}
-
以字典的形式書寫出來更好,也更方便
上面的設置顏色和大小可以這樣設置更簡潔
技術點12:有關顏色的問題(講解)
顏色的分類:每一種像素都有自己的顏色,每一種顏色都可以由RGB3色組成,十六進制由4個二進制組成
(1)12bit顏色:#f00(代表紅) #0f0 #ff0 3*4 十六進制(每一個一組)
(2)24bit顏色:#ff0000 #ffff00 #000000 #ffffff 3*8 十六進制(每兩個一組)
-
(3)32bit顏色(RGB):(下面是一個紅) 4*8 最后另個數(shù)字是透明度
指定的RGB顏色
#define CWColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0];//隨機色(配合上面的的使用) #define CWRandomColor CWColor(arc4random_uniform(256),arc4random_uniform(256),arc4random_uniform(256))
技術點13.自定義NSLog
分析:在開發(fā)項目時,我們常常喜歡測試,會設置很多的NSLog,問題來了,在項目結束的時候會有很多的NSLog,如何一個一個的去關閉太麻煩,如果不關閉大家知道打印是很消耗性能的,下面我們就自定義NSLog.
解決問題:我們在開發(fā)程序的過程中都是處在Debug模式,而在項目上線之后處在Release模式
在Pch文件里面寫上
#ifdef DEBUG //處于開發(fā)階段
#define CWLog(...) NSLog(__VA_ARGS__)
#else //處于發(fā)布階段(沒有輸出
#define CWLog(...)
#endif
技術14.如何在導航欄上設置一個搜索框??哪種方法最好???
- 最終效果圖
- 能夠擁有輸入框的目前為止我們經(jīng)常用的有UITextField和UISearchBar以及UITextView三種
解釋:(只要是繼承于UIControl) - 1.UITextFiled是在此比較好的輸出入框,因為它是小文本輸入,設置多樣化,很多的屬性
- 2.UISearchBar也很好,屬性較少,限制太多,無法把??放到左邊,總之它也很好,主要是搜索框
- 3.UItextView是大文本的輸入,不適合搜索
選擇第一種的代碼:(imageVIew一定要設置frame,圖片一定要放到左邊且contentMode圖片居中)
UITextField *searchBar = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 300, 30)];
searchBar.backgroundColor = [UIColor grayColor];
//搜索框字體的大小以及搜索的提示語
searchBar.font = [UIFont systemFontOfSize:15];
searchBar.placeholder = @"請輸入搜索條件";
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
//圖片靠左又居中**(imageView沒有發(fā)生變化變化的是image的大小)**
imageView.contentMode = UIViewContentModeCenter;
imageView.image = [UIImage imageNamed:@"searchbar_second_textfield_search_icon"];
searchBar.leftView = imageView;
//始終放到左邊
searchBar.leftViewMode = UITextFieldViewModeAlways;
邊框的模式
searchBar.borderStyle = UITextBorderStyleRoundedRect;
[searchBar addTarget:self action:@selector(change) forControlEvents:UIControlEventEditingChanged];
//設置為導航欄的titleView
self.navigationItem.titleView = searchBar;
技術15.設置一張圖片有沒有尺寸的兩種方式(imageView)
第一種方式:通過initWithImage來創(chuàng)建初始化UIImage,UIImageView的尺寸就等于image的尺寸
UIImage *image = [UIImage imageNamed:@"圖片的名字"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
第二種方式:通過init來創(chuàng)建絕大部分控件,控件都是沒有尺寸
UIImageView *imageview = [[UIImageView alloc]init];//建議在此設置CGRectmake()
imageview.image = [UIImage imageNamed:@"圖片的名字"];
技術16.怎么設置微博首頁的點擊下拉菜單??如下
-
解決辦法
分析:能點擊說明是button(也可以添加手勢)
下面以button為例:-(void)setNavigationTitle { //中間的標題按鈕 button = [[UIButton alloc]init];//等于 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame =CGRectMake(0, 0, 150, 35); //設置圖片和文字 [button setTitle:@"首頁" forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; button.titleLabel.font = [UIFont boldSystemFontOfSize:22]; [button setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 60)]; [button setImage:[UIImage imageNamed:@"navigationbar_arrow_down"] forState:UIControlStateNormal]; [button setImageEdgeInsets:UIEdgeInsetsMake(0, 90, 0, 0)]; //監(jiān)聽下拉菜單 [button addTarget:self action:@selector(clickTitle) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.titleView = button; } -(void)clickTitle { //如果圖片的某個方向不規(guī)則,比如有突起,那么這個方向就不能拉伸 UIImageView *dropdownMenu = [[UIImageView alloc]init]; dropdownMenu.image = [UIImage imageNamed:@"popover_background"]; dropdownMenu.frame = CGRectMake(80, 50, 200, 300); //[self.view.window addSubview:dropdownMenu];//self.view.window = [UIApplication sharedApplication].keyWindow; [[UIApplication sharedApplication].keyWindow addSubview:dropdownMenu];
}
- 獲取窗體window的方式(用window是為了防止點擊首頁跳出框被tabView的影響)
self.view.window = [UIApplication sharedApplication].keyWindow;
在此強烈推薦使用后者,因為后者永遠有值,而前者不靠譜
獲得window的方式:
UIWindow *window = [UIApplication sharedApplication].keyWindow;此做法可能會被鍵盤影響
技術點17.如何讓一個視圖或者其他東西永遠處在視圖的最上面,不被其他視圖影響??
- 分析:首先要了解一個程序可以創(chuàng)建無數(shù)個window,如何獲取當前最上面的window,方法如下:(技術16中的兩種方式均不太靠譜)
獲取window的三種方式(最后一種最靠譜)
UIWindow *window = self.view.window ;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
效果:可以保持我們所期望的在最上面,也可以避免鍵盤的影響
技術點18.如何讓出了跳出來的框框之外其他的地方都不可點擊???
分析:這是一個tabView,導航欄還有兩個按鈕,他們都可以被動,怎么避免彈出小窗口而其他地方不可點擊或者不可動
解決辦法:加一層“蒙版”,沒有那么神秘,就是一個view,frame等于窗體bounds,顏色clean,把小窗口和其他視圖隔開
-
處理代碼:(點擊首頁,先顯示蒙板,再顯示小窗口,這樣,小窗口里面的東西才可以點擊)
//獲取到最后面的window UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; window.backgroundColor = [UIColor brownColor]; UIView *cover = [[UIView alloc]init]; cover.frame = window.bounds; [window addSubview:cover]; //如果圖片的某個方向不規(guī)則,比如有突起,那么這個方向就不能拉伸 UIImageView *dropdownMenu = [[UIImageView alloc]init]; dropdownMenu.image = [UIImage imageNamed:@"popover_background"]; dropdownMenu.frame = CGRectMake(80, 50, 200, 300); //[self.view.window addSubview:dropdownMenu];//self.view.window = [UIApplication sharedApplication].keyWindow; [cover addSubview:dropdownMenu];
- 只需要把顏色設置為clean就好了,就能獲得上面的圖形,二其他地方就不能點擊了
window.backgroundColor = [UIColor clearColor];
- 特別說明:想在框框dropdownMenu添加東西只需要 addSubview,還需要注意的是dropdownMenu(UIIMageView的對象)不可交互
技術19.如何封裝一個菜單欄???(像上面的一樣,點擊首頁跳出)
- 分析:把菜單欄放在蒙板上,封裝蒙板就好了,蒙板繼承于UIView
- 解決辦法:建一個CWDropDownMenu類繼承與UIView進行封裝
具體的我會把封裝放到github
技術20.如何獲取一個視圖的最大y值或者x值???
解決辦法:
CGRectGetMaxX(view.frame) 獲取視圖的最大x值
CGRectGetMaxY(view.frame) 獲取視圖的最大y值
技術20.如何轉(zhuǎn)換坐標???(針對是view)(下面的如果toView:nil)nil代表window
分析:明確一個東西frame,一個控件的frame是相對于父視圖來說的
思路:在默認的情況下,frame是以父控件左上角為坐標原點,bounds是以自身的(0,0)為坐標原點的
-
下面是三個視圖的坐標代碼(普通控制器上面寫的代碼)
//1.blue self.blue = [[UIView alloc]initWithFrame:CGRectMake(0, 50, 300, 300)]; self.blue.backgroundColor = [UIColor blueColor]; [self.view addSubview:self.blue]; //2.red self.red = [[UIView alloc]initWithFrame:CGRectMake(100, 150, 100, 100)]; self.red.backgroundColor = [UIColor redColor]; [self.blue addSubview:self.red]; //3.yellow self.yellow = [[UIView alloc]initWithFrame:CGRectMake(20, 30, 50, 50)]; self.yellow.backgroundColor = [UIColor yellowColor]; [self.red addSubview:self.yellow];
現(xiàn)在我們改變黃色視圖的坐標(兩種方法一樣)
-
只需要記?。?.這是在計算yellow這個控件在相對于red上面的位置和尺寸
CGRect newRect1 = [self.yellow convertRect:self.yellow.bounds toView:self.red];CGRect newRect2 = [self.yellow.superview convertRect:self.yellow.frame toView:self.red];
-
下面是輸出:
NSLog(@"%@",NSStringFromCGRect(newRect1)); NSLog(@"%@",NSStringFromCGRect(newRect2)); 相對于自身的輸出 NSLog(@"%@",NSStringFromCGRect(self.yellow.bounds)); 相對于父視圖的輸出 NSLog(@"%@",NSStringFromCGRect(self.yellow.frame));
-
2.這是在計算magenta相對于button1的位置坐標和尺寸(輸出的表示和上面的一樣)
CGRect rectNew1 = [self.button1 convertRect:self.magenta.bounds fromView:self.magenta];
技術點21.當我們點擊某一個button的時候跳出來一個提示框并且提示框下面還有一個蓋板,此時如何消除我們的提示框???
分析:此時我們發(fā)現(xiàn)點擊任何地方都沒有反應,不過有一個觸屏方法touch我們沒有用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self dismiss];
}
-(void)dismiss
{
[self removeFromSuperview];
}
解決辦法:
1.點擊提示框以外會調(diào)用touch,我們調(diào)用移除dismiss即可
2.給蓋板view添加手勢,讓其點擊消失調(diào)用dismiss
- 重點:touchesBegan 這個方法只針對最底層的view來用,而不是其他的視圖的touches
技術22.如何設置微博下面的加號???給大家封裝好了
-
分析:加號到底是什么?如何設置??以及點擊加號之后又會發(fā)生什么???
解決辦法:不能把加號設置成一個控制器原因:浪費對象,加號的位置不好布局
具體的布局以及用法請下載我的封裝
技術23.如何讓時間在一個界面一直顯示而且不斷地更新???
- 分析:時間一直更新的話需要不斷地刷新這個界面的時間設定,我們可以進入這個界面就設置定時器,不斷地去刷新這個時間設定(可以設定指定的時間做某些事情)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
label = [[UILabel alloc]initWithFrame:CGRectMake(20, 200, 300, 50)]//聲明全局
label.backgroundColor = [UIColor whiteColor];
[self.view addSubview:label];
-(void)updateTime
{
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10*60];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
label.text = [dateFormatter stringFromDate:date];
if ([label.text isEqual: @"2016年06月09日 02:41:00"]) {
//在此可以設定指定的時間做某些事情
}
}
技術24.版本特性指什么??四舍五入(int)(number+0.5)(只適用1位小數(shù))
分析:版本顧名思義就是程序的新版本,也可以理解為首頁登錄的導航圖
具體的做法,進行了封裝。存到github上面了,可以查看,稍后附上鏈接
里面會涉及到四舍五入(只適用1位小數(shù)),具體的做法是,四舍五入:加0.5再強轉(zhuǎn),如(int)(number+0.5)
舉個例子:
原數(shù) 加0.5 求和 舍去小數(shù)(得到四舍五入的數(shù)字)
1.3 1.3+0.5 = 1.8 1
1.5 1.5 +0.5 = 2.0 2
1.6 1.6 + 0.5 = 2.1 2
0.7 0.7 + 0.5 = 1.2 1
四舍五入(只適用1位小數(shù)) 如果是1.66 ,則(1.66+0.5)*10取整,再取一位小數(shù),再按照上面的
技術25.如果發(fā)現(xiàn)一個控制器添加到另外一個控制器,但是它的數(shù)據(jù)卻沒有了?怎么解決??那么把一個控制器添加到另外一個控制器又有什么價值呢???
- 分析:極大可能是因為控制器被提前銷毀了(俗稱程序控制器壞死)
解決辦法:需要定義下面的控制器屬性
先定義
@property(nonatomic,strong)MeasageViewController *measageViewController;
再懶加載
-(MeasageViewController *)measageViewController
{
if (!_contactViewController) {
_measageViewController = [[MeasageViewController alloc]init];
_measageViewController.view.frame = self.view.frame;
}
return _measageViewController;
}
最后在viewDidLoad 添加就好了
- 需要注意的地方:控制器的view還在,但是view上面的數(shù)據(jù)不顯示,極大可能是因為控制器被提前銷毀了
- 1.一個控制器的view是可以隨意調(diào)整尺寸和位置的
- 2.一個控制器的view是可以隨意添加到其他view中
- 3.如果將一個控制器的view,添加到其他view中顯示,那么要想辦法保證不被銷毀
- 4.原則:只要view在,view所在的控制器必須的在,這樣才能保證view內(nèi)部的數(shù)據(jù)和業(yè)務邏輯正常
技術26:關于圖片的一些設置以及加載方式‘
解析:
程序啟動會自動加載叫做Default.png的圖片
3.5inch retain 屏幕:Default@2x.png
3.5inch 非retain屏幕:Default.png
4.0inch retain 屏幕:Default-568h@2x.png
只有程序啟動時自動去加載的圖片才會查找-568h@2x.png
技術27.點擊切換一個Button兩種狀態(tài)下的圖片
分析:效果圖
- 解決辦法:設置兩張圖片,分別為選中UIControlStateSelected和未選中下UIControlStateNormal
比如下面的代碼:
UIButton *_shareBtn = [[UIButton alloc]init];
_shareBtn.frame = CGRectMake(CWKWindowWidth*(KImageCount-1)+CWKWindowWidth*0.5-93,CWKWindowHeight*0.7, 186, 42.5);
[_shareBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_shareBtn setImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal];
[_shareBtn setImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateSelected];
[_shareBtn setTitle:@"分享" forState:UIControlStateNormal];
[_shareBtn addTarget:self action:@selector(shareClick:) forControlEvents:UIControlEventTouchUpInside];
-(void)shareClick:(UIButton *)shareBtn
{
shareBtn.selected = !shareBtn.isSelected;
}
- 重點代碼:shareBtn.selected = !shareBtn.isSelected;
技術28. 如何讓圖片和分享這兩個字有一定的距離??
分析:在button上面加載圖片用image,而button上面覆蓋圖片用backgroundImage,在此要用到titleEdgeInsets這個屬性,用法如下:
-
具體的用法(有關button里面三種屬性的用法,以及區(qū)別)
//1.contentEdgeInsets:(自切:切除的就不能用了,也就是不能放東西)會影響按鈕內(nèi)部的所有內(nèi)容(里面的imageView和titleLabel)
//切多少就有多少不能被用,相當于留出多余的面積
//button.contentEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);//2.titleLabelEdgeInsets 只影響按鈕內(nèi)部的titleLabel
button.titleEdgeInsets = UIEdgeInsetsMake(5,20, 0, 0);
//3.imageEdgeInsets 只影響按鈕內(nèi)部的imageView
button.imageEdgeInsets = UIEdgeInsetsMake(20,0, 0, 50);
技術29.一個空間看不見的可能性有哪些???
- 分析:如下可能性很多
/*
* 1.根本沒有創(chuàng)建實例化這個控件
*
* 2.沒有設置尺寸 UIPageControl沒設置尺寸也會出來
*
* 3.控件的顏色可能跟父控件的顏色一樣
*
* 4.控件的透明度為alpha <= 0.01;
*
* 5.hidden = YES
*
* 6.沒有添加到父控件中
*
* 7.這個控件被其他控件擋住了
*
* 8.位置不對(指坐標)
*
* 9.父控件發(fā)生了以上的情況
*
* 10.特殊情況:image設置了,但是圖片沒有設置,就無法顯示
*
* UIImageView沒有設置image屬性,或者設置的圖片名字不對
*
* UILabel沒有設置文字,或者文字的顏色和父控件的顏色一樣
*
* UITextFiled沒有設置文字,或者沒有設置邊框樣式borderStyle
*
* UIPageControl沒有設置頁碼,不會顯示小圓點
*
* UIButton內(nèi)部imageView和titleLabel的frame被篡改了,或者imageView和titlleLabel沒有內(nèi)容
*
*/
技術30.如何讓UITextView大文本輸入框一直可以顯示內(nèi)容且內(nèi)容一直會顯示最后一行的內(nèi)容?
- 分析: 只需要讓文本內(nèi)容一直疊加換行。最主要的是顯示最后一行
定義三個全局的變量:
int count;
NSTimer *timer;
UITextView *textView;//之后執(zhí)行下面的
{
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
count = 0;
textView = [[UITextView alloc]initWithFrame:self.view.bounds];
textView.font = [UIFont systemFontOfSize:25];
[self.view addSubview:textView];
}
-(void)updateTime
{
count ++;
NSLog(@"%d",count);
NSString *text = textView.text;
textView.text = [text stringByAppendingFormat:@"%d \n",count];
NSRange range;
range.length = textView.text.length;
[textView scrollRangeToVisible:range];
}
技術31.版本新特性如何設定??(也就是新手導航與版本更新)
-
具體的代碼
Appdelegate.m 里面 //1.重寫window self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; //2.設置根控制器 //獲取上一次的使用版本 (儲存在沙盒中的版本號) NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"CFBundleVersion"]; //當前軟件的版本號(從info.plist中獲?。﹥煞N寫法 //1.NSString *currentVersion = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]; NSDictionary *info = [NSBundle mainBundle].infoDictionary; //當前的version NSString *currentVersion = info[@"CFBundleVersion"]; NSLog(@"%@",currentVersion); //只要不相等就是新特性 if ([lastVersion isEqualToString:currentVersion]) {//版本號相同:這次打開和上次打開始同一個版本 self.window.rootViewController = [[RootTabBarController alloc]init]; } else//這次打開的版本和上次不一樣,顯示新的特性 { //將當前的版本號存進沙盒 [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"CFBundleVersion"]; //立馬把版本號存進去.不可少,少了可能出問題 [[NSUserDefaults standardUserDefaults] synchronize];//synchronize |?s??kr?na?z| 使同步,使同時發(fā)生 self.window.rootViewController = [[NewViewController alloc]init]; } //3.顯示window [self.window makeKeyAndVisible];
//在新特性控制器里面 (點擊button走這里)
-(void)clickNewController { // //獲取到應用程序的delegate // AppDelegate *delegate = [UIApplication sharedApplication].delegate; // [delegate startChange]; /*切換控制器的手段 * * 1.push :依賴于UINavigationController,控制器的切換是可逆的,比如A切換到B,B又可以回到A * * 2.model:控制器的切換是可逆的,比如A切換到B,B又可以回到A,而且新特性又不可釋放,占據(jù)內(nèi)存 * * 3.切換window的rootController,而且不可逆,且新特性的控制器被銷毀 * */ UIWindow *window = [UIApplication sharedApplication].keyWindow; window.rootViewController = [[RootTabBarController alloc]init]; }
技術32.微博數(shù)據(jù)請求的一些要求???
什么樣的應用才有資格被用戶授權?
1.注冊一個新浪微博賬號,成為新浪的開發(fā)者,
2.登錄開發(fā)者主頁http://open.weibo.com/,創(chuàng)建一個應用
3.創(chuàng)建完成后,會獲得以下主要信息
1>AppKey:應用的唯一標識,相當于應用的身份證
2>APPsecret:
3>RedirectURI(回調(diào)地址)
技術33.OAuth授權步驟
第三方想訪問服務提供商的用戶資源時,需要先進行OAuth授權
OAuth授權的步驟總結就3點:
1.獲取未經(jīng)授權的Request Token
2.獲取用戶授權的Request Token
3.用戶授權的Request Token換取 Access Token(授權標記)
(得到這個Access Token 就相當于得到了一個“令牌”,通過此“令牌”請求,就可以去擁有資源的網(wǎng)站抓取任意有權限可以被抓取的資源)對上面的解釋
下面是具體的步驟:
技術34.請求出現(xiàn)的錯誤(分析)
- 分析:這種問題表示參數(shù)傳錯了或者是沒有傳參數(shù)