去年放假之前大概完成了新浪微博項目,到現在也忘得差不多了,打算在重新寫一遍。之前的一些筆記在新浪的博客SleenXiu,在這主要是把新浪微博以隨筆的形式寫在這,方便以後的複習。 先看看之前主要完成的幾個點,秒拍視頻連接:http://video.weibo.com/show?fid=1034:32e
去年放假之前大概完成了新浪微博項目,到現在也忘得差不多了,打算在重新寫一遍。之前的一些筆記在新浪的博客SleenXiu,在這主要是把新浪微博以隨筆的形式寫在這,方便以後的複習。
先看看之前主要完成的幾個點,秒拍視頻連接:http://video.weibo.com/show?fid=1034:32ed06b90b1bba7ba25cc546a06fa949
今天開始重新寫一遍,在這記下來。
經典框架的搭建,所謂經典框架就是最底層為UITabBarController,管理幾個UINavigationController,不同的UINavigationController又管理相應的VC。
1.在appdelegate中完成初步的框架搭建,我們需要一個自定義的UITabBarController,併成為window的根控制器。
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customization after application launch. 3 4 // 設置視窗 5 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 6 7 // 初始化自己的tabbarController 8 SVTabbarController *tabbar = [[SVTabbarController alloc] init]; 9 10 // 為視窗添加根控制器, 11 self.window.rootViewController = tabbar; 12 13 // 顯示視窗 14 [self.window makeKeyAndVisible]; 15 16 return YES; 17 }
2.對文件進行分組,按照模塊分,下麵的MVC結構。
3.在自己的tabbarcontroller中為其添加子控制器[self addController],為方法編寫代碼。(後面會對這段代碼進行優化)
1 // 添加子控制器 2 - (void)addController 3 { 4 SVHomeController *homeVC = [[SVHomeController alloc] init]; 5 SVNavigationController *homeNav = [[SVNavigationController alloc] initWithRootViewController:homeVC]; 6 homeVC.title = @"首頁"; 7 homeVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_home_os7"]; 8 homeVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected_os7"]; 9 [self addChildViewController:homeNav]; 10 11 SVHomeController *messageVC = [[SVHomeController alloc] init]; 12 SVNavigationController *messageNav = [[SVNavigationController alloc] initWithRootViewController:messageVC]; 13 messageVC.title = @"消息"; 14 messageVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_message_center_os7"]; 15 messageVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_message_center_selected_os7"]; 16 [self addChildViewController:messageNav]; 17 18 SVHomeController *discoverVC = [[SVHomeController alloc] init]; 19 SVNavigationController *discoverNav = [[SVNavigationController alloc] initWithRootViewController:discoverVC]; 20 discoverVC.title = @"發現"; 21 discoverVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover_os7"]; 22 discoverVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_discover_selected_os7"]; 23 [self addChildViewController:discoverNav]; 24 25 SVHomeController *meVC = [[SVHomeController alloc] init]; 26 SVNavigationController *meNav = [[SVNavigationController alloc] initWithRootViewController:meVC]; 27 meVC.title = @"我"; 28 meVC.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile_os7"]; 29 meVC.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_profile_selected_os7"]; 30 [self addChildViewController:meNav]; 31 }
基本效果已經有了
4.tabbar的導航不是想要的效果,刪除系統自帶的tabbaritem,添加自定義tabbar,[self addtabbar]。
1 // 移除系統的tabbar,view將要出現的時候刪除掉原有tabbar上所有的item 2 - (void)viewWillAppear:(BOOL)animated 3 { 4 [super viewWillAppear:animated]; 5 6 for (UIView *child in self.tabBar.subviews) { 7 if ([child isKindOfClass:[UIColor class]]) { 8 [child removeFromSuperview]; 9 } 10 } 11 } 12 // 增加自己的tabbar 13 - (void)addTabbar 14 { 15 // 初始化自己的tabbar 16 SVTabbar *tabbar = [[SVTabbar alloc] initWithFrame:self.tabBar.bounds]; 17 // 保存自己的tabbar 18 self.mytabbar = tabbar; 19 // 添加自己的tabbar 20 [self.tabBar addSubview:tabbar]; 21 // 為tabbar添加代理 22 tabbar.delegate = self; 23 24 }
5.封裝自己的tabbar,添加控制項,自定義按鈕item,完成跳轉
5-1.添加控制項,根據有多少個控制器添加相應個數的btn,而btn的相應值通過item進行傳遞,在tabbar中提供- (void)addBtnWithItem:(UITabbarItem)item;方法添加自己的item(btn)1 - (void)addBtnWithItem:(UITabBarItem *)item 2 { 3 // 初始化btn 4 SVTabbarButton *btn = [[SVTabbarButton alloc] init]; 5 // 保存btn 6 [self.tabbarBtns addObject:btn]; 7 // 賦值btn 8 btn.item = item; 9 // 添加btn 10 [self addSubview:btn]; 11 // 為按鈕綁定點擊事件 12 [btn addTarget:self action:@selector(selectedBtn:) forControlEvents:UIControlEventTouchUpInside]; 13 // 預設選中第一個 14 if (self.tabbarBtns.count == 1) { 15 [self selectedBtn:btn]; 16 } 17 } 18 // 按鈕的點擊事件 19 - (void)selectedBtn:(SVTabbarButton *)btn 20 { 21 // 通知代理 22 if ([self.delegate respondsToSelector:@selector(tabbar:didSelectBtnFrom:to:)]) { 23 [self.delegate tabbar:self didSelectBtnFrom:(int)self.currentBtn.tag to:(int)btn.tag]; 24 } 25 // 設置tabbar的選中 26 self.currentBtn.selected = NO; 27 btn.selected = YES; 28 self.currentBtn = btn; 29 } 30 // 佈局按鈕 31 - (void)layoutSubviews 32 { 33 self.subviews[0].center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); 34 35 for (int index = 0; index<self.tabbarBtns.count; index++) { 36 SVTabbarButton *btn = self.tabbarBtns[index]; 37 38 CGFloat bW = self.frame.size.width/self.subviews.count; 39 CGFloat bH = self.frame.size.height; 40 CGFloat bX = index * bW; 41 CGFloat bY = 0; 42 if (index>1) { 43 bX += bW; 44 } 45 btn.frame = CGRectMake(bX, bY, bW, bH); 46 47 btn.tag = index; 48 } 49 }5-2.自定義按鈕,重新佈局按鈕的位置,並對按鈕進行賦值數據,有四個控制器,所以重構添加控制器的方法,根據不同的控制器為相應屬性賦值。
1 // 重新佈局btn內部的控制項得到想要的效果 2 - (instancetype)initWithFrame:(CGRect)frame 3 { 4 if (self = [super initWithFrame:frame]) { 5 // 圖片居中顯示 6 self.imageView.contentMode = UIViewContentModeCenter; 7 // 文本居中顯示 8 self.titleLabel.textAlignment = NSTextAlignmentCenter; 9 // 設置字體大小 10 [self.titleLabel setFont:[UIFont systemFontOfSize:13]]; 11 12 // 設置字體顏色 13 [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 14 [self setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected]; 15 } 16 return self; 17 } 18 // 重寫item的set方法,對btn進行賦值 19 - (void)setItem:(UITabBarItem *)item 20 { 21 _item = item; 22 23 [self setTitle:item.title forState:UIControlStateNormal]; 24 [self setImage:item.image forState:UIControlStateNormal]; 25 [self setImage:item.selectedImage forState:UIControlStateSelected]; 26 } 27 // 內部圖片的位置 28 - (CGRect)imageRectForContentRect:(CGRect)contentRect 29 { 30 CGFloat imageW = contentRect.size.width; 31 CGFloat imageH = contentRect.size.height * 0.6; 32 return CGRectMake(0, 0, imageW, imageH); 33 34 } 35 // 內部文字的位置 36 - (CGRect)titleRectForContentRect:(CGRect)contentRect 37 { 38 CGFloat titleY = contentRect.size.height * 0.6; 39 CGFloat titleW = contentRect.size.width; 40 CGFloat titleH = contentRect.size.height - titleY; 41 return CGRectMake(0, titleY, titleW, titleH); 42 } 43 // 去掉按鈕的高亮狀態 44 - (void)setHighlighted:(BOOL)highlighted {}5-3.完成點擊按鈕控制器的跳轉,取消按鈕高亮狀態,預設選中第一的按鈕,按鈕綁定點擊事件,為自定義的tabbar寫代理,監聽按鈕點擊跳轉控制器
1 @protocol SVTabbarDelegate <NSObject> 2 @optional 3 // 當tabbar上的按鈕點擊的時候會調用 4 - (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to; 5 @end
1 #pragma mark tabbar的代理方法 2 - (void)tabbar:(SVTabbar *)tabbar didSelectBtnFrom:(int)from to:(int)to 3 { 4 self.selectedIndex = to; 5 }6.添加中間的加號按鈕,位置固定所以直接一次設置就好
1 - (instancetype)initWithFrame:(CGRect)frame 2 { 3 if (self = [super initWithFrame:frame]) { 4 UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 5 6 [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_os7"] forState:UIControlStateNormal]; 7 [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted_os7"] forState:UIControlStateHighlighted]; 8 [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_os7"] forState:UIControlStateNormal]; 9 [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted_os7"] forState:UIControlStateHighlighted]; 10 plusBtn.frame = CGRectMake(0, 0, plusBtn.currentBackgroundImage.size.width, plusBtn.currentBackgroundImage.size.height); 11 12 [self addSubview:plusBtn]; 13 } 14 return self; 15 }
今天就先做這一點,基本大的框架就已經好了,明天修一下細節。