实习小结——UIBarButtonItem和UINavigationBar的坑

这一周做了很多UI方面的东西,遇到的坑主要集中在UIBarButtonItem和UINavigationBar,记录一下备查。

UIBarButtonItem自定义位置

直接用系统默认的方式生成按钮是无法选择位置的,甚至连这个按钮的默认位置都不清楚。如果想要自定义按钮的位置,有两种选择。

一、直接修改系统生成的按钮。

可以通过UIBarButtonItem的imageInsets属性,修改图片的位置,从而间接的修改按钮位置。代码如下:

UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithImage:image imageWithRenderingMode:mode style:UIBarButtonItemStylePlain target:self action:xxx];
rightItem.imageInsets = UIEdgeInsetsMake(-4, 0, 0, 0);
self.navigationItem.rightBarButtonItem = rightItem;

为了突出重点,第一行生成rightItem的代码做了一些简化处理,不用过于关注。UIEdgeInsetsMake方法分别在上、左、下、右四个方向规定了图片的伸缩量。

二、完全自定义按钮。

通过UIBarButtonItem的customView属性,可以实现按钮的完全自定义。就不具体写代码了。

两种方法的比较:
代码简洁性:显然第一种方式更简单清晰,如果只是要简单的移动位置,推荐第一种方式。

UI美观性:由于第一种方法用到了系统默认的UIBarButtonItem,它在高亮状态下是呈现透明的。而第二种方法需要自定义UIButton,默认高亮状态下变灰。个人认为第一种方式更美一些。当然通过自定义UIButton,也可以达到同样的效果,不过代码会更加复杂。

动画效果:我在项目中遇到了一个需求,当主页面的tableview向下滑动的时候,navigationBar上的按钮逐渐淡出消失(alpha从1到0)。这种情况下,由于UIBarButtonItem并不继承自UIView,所以是不可能实现的。因此必须选择第二种方法。

所以,除非必须高度自定义,否则尽量选择代码代码简单的第一种实现方式即可。

修改Cell选中时的背景颜色

系统的tableview的cell,在选中装下变灰。美工觉得灰色太深了,需要自定义选中是的颜色。在不使用自定义UITableViewCell的情况下,可以利用cell的cell.selectedBackgroundView属性实现效果。代码如下:

UIColor *cellBackgroundColor = kColorFromRGBA(0, 0, 0, 0.02);
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame];
cell.selectedBackgroundView.backgroundColor = cellBackgroundColor;

ios7及以后,是通过navigationBar的barTintColor来修改颜色的。tintColor属性好像不能修改了。

不过在处理MFMailComposeViewController的时候,还是遇到了bug。这个ViewController是系统自带的,用于发送反馈邮件的ViewController。但是好像对它修改navigationBar颜色的代码一直无效。查阅了很多资料后发现一种可行的解决方案。

一定要确保修改navigationBar颜色的代码在创建MFMailComposeViewController对象之前调用。因此可以修改全局的navigationBar颜色。最后再在自己这个类的viewWillAppear方法中,把颜色改回来即可。

//这是需要创建MFMailComposeViewController的ViewController的.m文件
//关键在于创建mailPicker之前先改全局的navigationBar的颜色,记得在viewWillAppear方法中改回来。

[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];
mailPicker.mailComposeDelegate = self;

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UINavigationBar appearance] setBarTintColor:oldColor];
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值