iOS新聞客戶端教程5-Home主頁

在iOS App中,常用的主頁佈局是上面是導航欄,下面是TabBar。本教程將介紹如何開發一款這樣的新聞主頁。

導航欄

打開之前基類裏的BaseController類,在.m文件中增加下面代碼
BaseController.m

-(void)viewDidLoad
{
    [super viewDidLoad];
    [self setNavigationLeft:@"NavigationBell.png" sel:nil];
    [self setNavigationRight:@"NavigationSquare.png"];
    //[self setNavigationTitleImage:@"NavBarIcon.png"];
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self setNavBarImage];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    [self setStatusBarStyle:UIStatusBarStyleLightContent];

}

- (void)setNavBarImage
{
    UIImage *image = [UIImage imageNamed:[Global isSystemLowIOS7]?@"NavigationBar44.png":@"NavigationBar64.png"];
    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];

    NSDictionary *attribute = @{
        NSForegroundColorAttributeName:[UIColor whiteColor],
        NSFontAttributeName:[UIFont systemFontOfSize:18]
        };

    [self.navigationController.navigationBar setTitleTextAttributes:attribute];
}

- (void)setNavigationLeft:(NSString *)imageName sel:(SEL)sel
{
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:[self customButton:imageName selector:sel]];

    self.navigationItem.leftBarButtonItem = item;
}

- (void)setNavigationRight:(NSString *)imageName
{
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:[self customButton:imageName selector:@selector(doRight:)]];

    self.navigationItem.rightBarButtonItem = item;
}

- (UIButton *)customButton:(NSString *)imageName
                  selector:(SEL)sel
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    btn.frame = CGRectMake(0, 0, 44, 44);
    [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
    [btn addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];

    return btn;
}

這樣每個繼承BaseController子類,會在初始化的時候,就設置它的navigationBar了。這裏再一次證明了封裝的好處。

TabBar

TabBar主要是爲了在有限的空間上展示更多的內容,類似Web界面的選項卡。我們主頁有5個tab,分別是 新聞 - 閱讀 - 視聽 - 發現 - 我。那麼我們首先要定義5個ViewController來分別代表這個5個tab。
新建以下幾個類,都繼承BaseController
NewsController
ReaderController
VoiceController
DiscoveryController
MyController
暫時這5個類什麼都不做

爲了更好的維護TabBar,我們定義TabBar加載的類在plist文件中,在Resources下新建TabBarControllers.plist,輸入以下內容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>ClassName</key>
        <string>NewsController</string>
        <key>Title</key>
        <string>新聞</string>
        <key>Image</key>
        <string>NewsIcon.png</string>
        <key>SelectImage</key>
        <string>NewsIconSelect.png</string>
    </dict>
    <dict>
        <key>ClassName</key>
        <string>ReaderController</string>
        <key>Title</key>
        <string>閱讀</string>
        <key>Image</key>
        <string>ReaderIcon.png</string>
        <key>SelectImage</key>
        <string>ReaderIconSelect.png</string>
    </dict>
    <dict>
        <key>ClassName</key>
        <string>VoiceController</string>
        <key>Title</key>
        <string>視聽</string>
        <key>Image</key>
        <string>VoiceIcon.png</string>
        <key>SelectImage</key>
        <string>VoiceIconSelect.png</string>
        <key>UnLoad</key>
        <false/>
    </dict>
    <dict>
        <key>ClassName</key>
        <string>DiscoveryController</string>
        <key>Title</key>
        <string>發現</string>
        <key>Image</key>
        <string>DiscoveryIcon.png</string>
        <key>SelectImage</key>
        <string>DiscoveryIconSelect.png</string>
    </dict>
    <dict>
        <key>ClassName</key>
        <string>MyController</string>
        <key>Title</key>
        <string></string>
        <key>Image</key>
        <string>MyIcon.png</string>
        <key>SelectImage</key>
        <string>MyIconSelect.png</string>
    </dict>
</array>
</plist>

這樣以後要增加一個tab,只需要增加一個dict配置就可以了。
現在各個tab的類都有了,那麼我們還差一個主頁,新建一個主頁HomeController,注意,HomeController要繼承UITabBarViewController

-(id)init
{
    if(self = [super init]){
        [self addTabControllers];
    }
    return self;
}

-(void)addTabControllers
{
    self.tabBar.tintColor = [UIColor redColor];
    self.viewControllers = [PageInfo pageControllers];

}

將加載每個Tab對應類的操作,封裝在Model層的PageInfo類中。
新建PageInfo類

-(instancetype) initWithDict:(NSDictionary *)dict
{
    PageInfo *info = [[PageInfo alloc] init];

    info.ID = [dict objectForKey:@"ClassName"];
    info.name = [dict objectForKey:@"Title"];
    info.image = [dict objectForKey:@"Image"];
    info.selectImage = [dict objectForKey:@"SelectImage"];
    info.unLoad = [[dict objectForKey:@"UnLoad"] boolValue];

    return info;
}
//從plist中讀取要加載的類
+(NSArray *)pages
{
    NSString *configFile = [[NSBundle mainBundle] pathForResource:@"TabBarPages" ofType:@"plist"];
    NSArray *configs = [NSArray arrayWithContentsOfFile:configFile];
    NSMutableArray *pages = [[NSMutableArray alloc] init];

    if(configs.count <=0){
        BASE_INFO_FUN(@"TabBarConfig未設置");
    }
    for (NSDictionary *dict in configs) {
        [pages addObject:[PageInfo infoWithDict:dict]];
    }
    return pages;
}

+ (NSArray *)pageControllers
{
    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    NSArray *pages = [self pages];
    UINavigationController *nav = nil;
    UIViewController *pageController = nil;

    for (PageInfo *pageInfo in pages) {
        if(pageInfo.unLoad){
            if(pageInfo.unLoad){
                continue;
            }
        }
        pageController = [[NSClassFromString(pageInfo.ID) alloc] init];
        nav = [[UINavigationController alloc]initWithRootViewController:pageController];
        pageController.title = pageInfo.name;
        pageController.tabBarItem.image = [UIImage imageNamed:pageInfo.image];
        [controllers addObject:nav];
    }
    return controllers;
}

這裏PageInfo從plist文件中讀取需要加載的類,非常靈活,方便擴展。

接下來,我們修改App加載廣告後,啓動Home頁
AppDelegate.m

-(void) showHomePage
{
    HomePage *homePage = [[HomePage alloc] init];
//    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:homePage];
    self.window.rootViewController = homePage;
    [self.window makeKeyAndVisible];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //創建程序window
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [self showHomePage];
    [self.window makeKeyAndVisible];
    return YES;
}

Command + R 運行下,我們看到如下界面:
這裏寫圖片描述
這裏寫圖片描述
這樣,我們一個主頁就開發完成了。

github源碼:https://github.com/tangthis/NewsReader
個人技術分享微信公衆號,歡迎關注一起交流
個人技術微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章