iOS實戰01

来源:http://www.cnblogs.com/sleen/archive/2016/02/28/5225275.html
-Advertisement-
Play Games

去年放假之前大概完成了新浪微博項目,到現在也忘得差不多了,打算在重新寫一遍。之前的一些筆記在新浪的博客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 }

  今天就先做這一點,基本大的框架就已經好了,明天修一下細節。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML4.01 超文本標記語言,1999年12月24日由W3C組織發佈。 XHTML 擴展的超文本標記語言(eXtensible Hyper Text Markup Language),和HTML4.01具有良好的相容性,並且更加嚴格、純凈。XHTML要求HTML文檔首先必須是一份XML文檔。整個
  • 對css sprites通過例子進行了闡述
  • 一.ajax的作用: 1.就是讓js去讀伺服器上面的數據. 2.無刷新的情況下讀取伺服器上面的數據,例如:驗證賬號和密碼是否正確等. (1)ajax的優點: 1.減少冗餘請求和響應對服務造成的負擔. 2.無刷新更新頁面,帶來更好的用戶體驗. 3.減輕伺服器速寫的負擔,節約空間和寬頻租用成本。 4.採
  • 在前面的幾篇文章中,我講解過了js中的回收機制,但是對於當時的我來說,我自己對回收機制的這個概念也有些懵懵懂懂,現在對回收機制有了更深入的理解,所以特此發佈此文給於總結,也好加深記憶。 如果你想學習閉包那麼js中的回收機制是必不可少的,當然學習閉包除了需要理解js中的回收機制以外還需要瞭解其他的概念
  • 筆試時緊張沒寫出來,靜下心後發現簡單的要死. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head>
  • 1、CSS 盒模型(Box Model) 所有 HTML 元素都可以看作是盒子,在 CSS 中,“Box Model”這一術語主要是在佈局時使用。 CSS 盒模型(Box Model)規定了處理元素內容、邊框、內邊距 和 外邊距 的方式。 CSS 盒模型本質上是一個盒子,封裝周圍的 HTML 元素,
  • 編輯 撤銷Ctrl+Z 恢復Ctrl+Y 列編輯:Alt+C 縮進Tab 刪除縮進Shift+Tab 轉為大寫Crtl+Shift+U 轉為小寫Ctrl+U 複製當前行Crtl+D 刪除當前行Ctrl+L 分割行Ctrl+I 合併行Ctrl+J 上移當前行 Ctrl+Shift+Up 下移當前行 C
  • 斷更了一個多月,閱讀量立馬從100+跌落至10-,雖說不是很看重這個,畢竟只是當這個是自己的學習筆記,但有人看,有人評論,有人認同和批評的感覺還是很巴適的,尤其以前有過卻又被剝奪的,慘兮兮的。 好好寫吧。 現在開展的“業務”,一個是PHP,一個是Android開發。 前者偏向於三個方向,總結之前的(
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...