仿新浪微博IOS客户端(v5.2.8)——设置导航栏外观

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45849447

声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。

一、 在Xcode6下添加.pch文件

对于使用惯了之前版本Xcode的朋友来说,在系统提醒之下升级到Xcode 6之后,发现新建项目后Xcode不再帮我们创建.pch文件了。可是我们已经习惯了,把一些在很多地方都用的宏写到.pch文件中,那么没有这个文件该如何添加一个呢?下面先给我们的仿新浪微博项目添加一个.pch文件,具体步骤如下:

1、选中Supporting Files右键New File...,如下图

2、接下来选择创建一个PCH文件,如下图:

3、选择Next、Create就创建完毕了。接下来修改配置文件,在搜索框中输入“Prefix Header”,在Prefix Header这一项,填写上一步创建的pch文件的相对路径,修改完后如下图:

二、在上一篇的基础上,设置导航栏外观,具体实现如下:

1、创建WBNavigationController类,让其继承自UINavigationController。用我们自定义的WBNavigationController替换掉上一讲中使用UINavigationController类的地方,具体代码如下:

    // 使用系统默认的UINavigationController
    //[self addChildViewController:[[UINavigationController alloc] initWithRootViewController:childViewController]];

    // 使用我们自定义的导航栏(WBNavigationController继承自UINavigationController)
    WBNavigationController * navigationController = [[WBNavigationController alloc]initWithRootViewController:childViewController];
    [self addChildViewController:navigationController];

2、在WBNavigationController.m文件中添加,设置整个项目中所有UIBarButtonItem的外观样式,具体代码如下:

#pragma mark 在运行时仅被触发一次
#pragma mark 值得注意的是在此之前,父类的方法已经被执行过一次了,所以不需要调用super的该函数。
+ (void)initialize
{
    // 设置整个项目中所有UIBarButtonItem的外观样式
    UIBarButtonItem *item = [UIBarButtonItem appearance];

    // 设置在UIControlStateNormal下,导航栏文字的大小和颜色
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:kColor(64, 64, 64),
                                   NSFontAttributeName:[UIFont systemFontOfSize:15]}
                                forState:UIControlStateNormal];

    // 设置在UIControlStateHighlighted下,导航栏文字的大小和颜色
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:kColor(253, 109, 10),
                                   NSFontAttributeName:[UIFont systemFontOfSize:15]}
                                forState:UIControlStateHighlighted];
}

3、拦截所有push进来的控制器,设置除根控制器外的控制器的导航栏外观,具体实现如下:

#pragma mark 重写这个方法目的:能够拦截所有push进来的控制器
#pragma mark viewController这个参数是即将push进来的控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.viewControllers.count > 0) {
        // 如果push进来的控制器viewController,不是根控制器

        // 自动显示和隐藏tabbar
        viewController.hidesBottomBarWhenPushed = YES;

        // 设置导航栏上左边的返回按钮
        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(back)
            image:@"navigationbar_back_withtext"
            highImage:@"navigationbar_back_withtext_highlighted"
            title:self.title];
    }

    [super pushViewController:viewController animated:animated];
}

- (void)back
{
    [self popViewControllerAnimated:YES];
}

4、设置首页导航栏上的按钮,具体实现如下:

//
//  HomeViewController.m
//  SinaWeibo
//
//  Created by android_ls on 15/5/17.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//
//  首页动态列表控制器

#import "HomeViewController.h"
#import "UIBarButtonItem+Category.h"
#import "FriendAttentionStatusViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 设置导航栏左侧的按钮
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem leftBarButtonItemWithTarget:self
         action:@selector(friendsearch)
         image:@"navigationbar_friendsearch"
         highImage:@"navigationbar_friendsearch_highlighted"];

    // 设置导航栏右侧的弹出下拉菜单按钮
    self.navigationItem.rightBarButtonItem = [UIBarButtonItem rightBarButtonItemWithTarget:self
         action:@selector(pop)
         image:@"navigationbar_pop"
         highImage:@"navigationbar_pop_highlighted"];

}

#pragma mark 打开好友关注动态控制器
-(void)friendsearch
{
    MyLog(@"用户点击了左侧按钮");

    FriendAttentionStatusViewController *friendAttentionStatusVC = [[FriendAttentionStatusViewController alloc]init];
    [self.navigationController pushViewController:friendAttentionStatusVC animated:YES];
}

#pragma mark 弹出下拉菜单
-(void)pop
{
    MyLog(@"用户点击了右侧弹出下拉菜单按钮");

}

@end

5、已实现的效果图如下:

点击首页左侧按钮后:

   

点击底部ToolBar中的我,效果图如下:

点击导航栏设置按钮后,效果图如下:

三、目前用到的其它文件

1、自定义的UIView的分类,UIView+Category.h代码如下:

//
//  UIView+Category.h
//  SinaWeibo
//
//  Created by android_ls on 15/5/19.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIView (Category)

@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;

@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat height;

@property (nonatomic, assign) CGPoint origin;
@property (nonatomic, assign) CGSize size;

@property (nonatomic, assign) CGFloat centerX;
@property (nonatomic, assign) CGFloat centerY;

@end

UIView+Category.m代码如下:

//
//  UIView+Category.m
//  SinaWeibo
//
//  Created by android_ls on 15/5/19.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import "UIView+Category.h"

@implementation UIView (Category)

- (void)setX:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}

- (CGFloat)x
{
    return self.frame.origin.x;
}

- (void)setY:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}

- (CGFloat)y
{
    return self.frame.origin.y;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.frame.size.height;
}

- (void)setOrigin:(CGPoint)origin
{
    CGRect frame = self.frame;
    frame.origin = origin;
    self.frame = frame;
}

- (CGPoint)origin
{
    return self.frame.origin;
}

- (void)setSize:(CGSize)size
{
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

- (CGSize)size
{
    return self.frame.size;
}

- (void)setCenterX:(CGFloat)centerX
{
    CGPoint center = self.center;
    center.x = centerX;
    self.center = center;
}

- (CGFloat)centerX
{
    return self.center.x;
}

- (void)setCenterY:(CGFloat)centerY
{
    CGPoint center = self.center;
    center.y = centerY;
    self.center = center;
}

- (CGFloat)centerY
{
    return self.center.y;
}

@end

2、自定义的UIBarButtonItem的分类,UIBarButtonItem+Category.h 代码如下:

//
//  UIBarButtonItem+Category.h
//  SinaWeibo
//
//  Created by android_ls on 15/5/19.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (Category)

#pragma mark 设置左侧文字和图片组成的按钮的外观样式
+ (UIBarButtonItem *)itemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage title:(NSString *)title;

#pragma mark 设置左侧按钮的外观样式(只有图片)
+ (UIBarButtonItem *)leftBarButtonItemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage;

#pragma mark 设置右侧按钮的外观样式(只有图片)
+ (UIBarButtonItem *)rightBarButtonItemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage;

@end

UIBarButtonItem+Category.m代码如下:

//
//  UIBarButtonItem+Category.m
//  SinaWeibo
//
//  Created by android_ls on 15/5/19.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import "UIBarButtonItem+Category.h"

@implementation UIBarButtonItem (Category)

#pragma mark 设置左侧文字和图片组成的按钮的外观样式
+ (UIBarButtonItem *)itemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage title:(NSString *)title
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    [btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];

    [btn.titleLabel setFont:[UIFont systemFontOfSize:15]];
    [btn setTitle:title?title:@"返回" forState:UIControlStateNormal];
    [btn setTitle:title?title:@"返回" forState:UIControlStateHighlighted];
    [btn setTitleColor:kColor(64, 64, 64) forState:UIControlStateNormal];
    [btn setTitleColor:kColor(253, 109, 10) forState:UIControlStateHighlighted];

    [btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];

    // 设置尺寸
    btn.size = CGSizeMake(60, 44);

    // 调整UIBarButtonItem左侧的外边距
    CGFloat left = -8;
    btn.imageEdgeInsets = UIEdgeInsetsMake(0, left, 0, 0);
    btn.titleEdgeInsets = UIEdgeInsetsMake(0, left, 0, 0);

    return [[UIBarButtonItem alloc] initWithCustomView:btn];
}

#pragma mark 设置左侧按钮的外观样式(只有图片)
+ (UIBarButtonItem *)leftBarButtonItemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
    [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    [btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];

    // 设置尺寸
    btn.size = CGSizeMake(60, 44);

    // 调整UIBarButtonItem右侧的外边距
    CGFloat left = -8;
    btn.imageEdgeInsets = UIEdgeInsetsMake(0, left, 0, 0);
    return [[UIBarButtonItem alloc] initWithCustomView:btn];
}

#pragma mark 设置右侧按钮的外观样式(只有图片)
+ (UIBarButtonItem *)rightBarButtonItemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];
    [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    [btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];

    // 设置尺寸
    btn.size = CGSizeMake(60, 44);

    // 调整UIBarButtonItem右侧的外边距
    CGFloat right = -8;
    btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, right);
    return [[UIBarButtonItem alloc] initWithCustomView:btn];
}

@end

3、info.pch文件内容如下:

//
//  info.pch
//  SinaWeibo
//
//  Created by android_ls on 15/5/19.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#ifndef SinaWeibo_info_pch
#define SinaWeibo_info_pch

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#pragma mark 导入UIView的扩展类
#import "UIView+Category.h"

#endif

// 获得RGB颜色
#define kColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

// 日志输出宏定义
#ifdef DEBUG
// 调试状态
#define MyLog(...) NSLog(__VA_ARGS__)
#else
// 发布状态
#define MyLog(...)
#endif

#endif

4、ProfileViewController.m文件的源码如下:

<span style="font-size:14px;">//
//  ProfileViewController.m
//  SinaWeibo
//
//  Created by android_ls on 15/5/17.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import "ProfileViewController.h"
#import "SettingViewController.h"

@interface ProfileViewController ()

@end

@implementation ProfileViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     // 设置导航栏右侧的设置按钮
     UIBarButtonItem * barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"设置" style:0 target:self action:@selector(setting)];
    [barButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:kColor(253, 109, 10),
                                   NSFontAttributeName:[UIFont systemFontOfSize:15]}
                        forState:UIControlStateNormal];
    self.navigationItem.rightBarButtonItem = barButtonItem;

}

- (void)setting
{
    MyLog(@"用户点击了设置按钮");
    SettingViewController * settingViewController = [[SettingViewController alloc]init];
    [self.navigationController pushViewController:settingViewController animated:YES];
}

@end</span><span style="font-size:18px;color: rgb(0, 132, 0);">
</span>

时候不早了,今天就先到这里,晚安。

源码下载地址:http://download.csdn.net/detail/android_ls/8718359

时间: 2024-10-27 10:33:34

仿新浪微博IOS客户端(v5.2.8)——设置导航栏外观的相关文章

仿新浪微博IOS客户端(v5.2.8)——自定义UITabBar替换系统默认的(添加“+”号按钮)

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45896395 声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片. 自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个"+号按钮",下面我们来聊聊具体的实现. 1.自定义WBTabBar,让其继承自UITabBar,代码如下: // // WBT

仿新浪微博IOS客户端(v5.2.8)——下拉菜单栏的实现

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45877983 声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片. 接着上一篇博文,这篇我们来聊聊新浪微博导航栏上,点击中间部分的标题(titleView)弹出的下拉菜单是如何实现. 1.自定义导航栏中间的titleView,代码如下: // 设置导航栏中间的titleView _tit

仿新浪微博IOS客户端(v5.2.8)——搭建项目基本框架

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45827719 声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片. 最近我打算利用业余时间,仿下新浪微博IOS客户端,至于能写到哪里我也不确定,能写多少就写多少吧,下面我们开始项目的基本搭建: 1.打开Xcode选择创建新项目,并创建各个模块的目录结构,完成后项目的目录结构如下图: 2.

iOS项目开发实战——自定义设置导航栏和状态栏背景

在iPhone的状态栏顶部,会有很多的信息,如运营商,信号强弱,网络状况,时间,电量等等.我们使用很多的App,如微信,QQ等等,都会发现导航栏的背景或者说图片都是重新设置过的,这样就能增加用户体验,也能更加节省下方的屏幕空间.那如何来设置导航栏的图片呢? (1)首先建立一个iOS项目,语言选择Swift.并且在Images.xcassets中拖入一张图片,大小要自己设置好,用来作为顶部导航栏的背景. (2)在Main.storyboard中选中ViewController,然后选择Editor

[iOS微博项目 - 1.1] - 设置导航栏主题(统一样式)

A.导航栏两侧文字按钮 1.需求: 所有导航栏两侧的文字式按钮统一样式 普通样式:橙色 高亮样式:红色 不可用样式:亮灰 阴影:不使用 字体大小:15 github: https://github.com/hellovoidworld/HVWWeibo 2.实现效果 默认样式: 统一使用样式: 3.思路 在创建item的时候逐个设置:代码超级冗余 抽取创建公共父类:稍好的选择,但是继承了此公共父类的控制器,就不能操作其去继承系统自带的控制器类了,造成很大的隐患.iOS中控制器不建议提取公共父类,

仿Bilibili iOS客户端 练习案例源码

仿Bilibili iOS客户端 练习启动页 源码下载:http://code.662p.com/view/14534.html 首页    分区 发现 我的 视频信息 普通/直播 视频播放 详细说明:http://ios.662p.com/thread-3121-1-1.html

新浪微博客户端(4)-设置导航栏主题

为了使整个项目的NavigationBar 上的UIBarButtonItem的颜色,字体大小一致,需要设置导航栏主题. 由于项目使用的是自定义的DJNavigationController,而又要保证只设置一次,所以将设置主题的代码写在DJNavigationController.m文件中的initialize方法中. DJNavigationController.m #import "DJNavigationController.h" @implementation DJNavig

仿制新浪微博iOS客户端之四-未登录页面处理

写在最前:非常抱歉,前期因为个人原因有二十多天的时间没有再继续更新这个专题,期间仅仅是完成了苹果官方的UIStackView的文档的翻译.在这里我们将继续未完成的任务,继续做下去!现在继续! 一.前期总结 在完成第三篇的任务后,我们实际上完成的效果如下: 目前我们已经能保证界面的顺利切换,并且给微博的撰写按钮预留了点击事件接口,再下一步,我们将要完成在用户登录前的所有准备工作. 二.抽取基类 目前我们在首页.消息.发现.我这四个界面中使用的都是UITableViewController来加载和显

iOS不得姐项目--appearance的妙用,再一次设置导航栏返回按钮,导航栏左右按钮的封装(巧用分类)

一.UI_APPEARANCE_SELECTOR 彩票项目中appearance的用法一直没有搞明白,这次通过第二个项目中老师的讲解,更深一层次的了解到了很多关于appearance的作用以及使用方法. 在iOS属性后有UI_APPEARANCE_SELECTOR标志都可以一次性统一设置.这种情况还有很多.比如说统一设置UITabbarItem的文字颜色 通过appearance来同意设置属性最好是在+ (void)initialize;方法里面. 项目中设置导航栏背景图片的代码: 项目中设置T