您的位置:首页 > 产品设计 > UI/UE

导航条UIBarButtonItem添加图片,如何避免渲染

2016-01-12 17:35 495 查看
今天在学swift的时候发现的这个方法(表脸啊,明明是一起学swift的小伙伴先发现的啊),只需要一句代码(看看下面的这些代码,真是又忧伤又喜悦)

UIImage *image = [[UIImage imageNamed:@"lt_ic_my"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[btn setImage:image forState:UIControlStateNormal] ;
关键在imageWithRenderingMode这个方法,看Apple注释

// Create a version of this image with the specified rendering mode. By default, images have a rendering mode of UIImageRenderingModeAutomatic.
- (UIImage *)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);


大意是用指定的渲染模式创建image对象。默认情况下,图像的渲染模式uiimagerenderingmodeautomatic,我们需要的是UIImageRenderingModeAlwaysOriginal

讲真,我会一辈子记住这句代码...

====================================================================================================================================

今天做项目时碰到的需求:

导航条的leftBarButtonItem需要做一个未读提醒,效果如图所示:


贴心的UI妹子也给切图了,有未读一套图,读完另外一套。

熟悉导航条的都知道,导航条有个tintColor属性,当你不设置时恒为蓝色

,而设置了就恒为你设置的颜色(例:白色)

,然后搞了半天,我就有些崩溃,以我的水平真的是没找到利用导航条属性来倔强的用UI妹子图的方法。

在下输了,于是发挥了中国人迂回解决问题的方法,舍弃UI妹子,单独创建一个Button来显示未读小红点,代码如下:

- (UIView *)myView {
if (!_myView) {
_myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36, 36)];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setAdjustsImageWhenHighlighted:NO];
[btn addTarget:self action:@selector(enterPersonInfoPage) forControlEvents:UIControlEventTouchUpInside];
[_myView addSubview:btn];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
}];
[btn setImage:[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];

UIButton *unreadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
self.unreadBtn = unreadBtn;
[_myView addSubview:unreadBtn];
[unreadBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_myView).offset(3);
make.right.equalTo(_myView).insets(UIEdgeInsetsZero);
make.height.equalTo(8);
make.width.equalTo(8);
}];
}
return _myView;
}


设置导航条时直接:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.myView];


当有未读消息时:

[self.unreadBtn setImage:[UIImage imageNamed:@"unread"] forState:UIControlStateNormal];
没有时:

[self.unreadBtn setImage:nil forState:UIControlStateNormal];


今天又找到一个方法:

在放图片的button下方放一个透明的button,代码如下:

- (UIView *)myView {
if (!_myView) {
_myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36, 36)];

UIButton *clearBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[clearBtn setAdjustsImageWhenHighlighted:NO];
[_myView addSubview:clearBtn];
[clearBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
}];

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setAdjustsImageWhenHighlighted:NO];
[btn addTarget:self action:@selector(enterPersonInfoPage) forControlEvents:UIControlEventTouchUpInside];
[_myView addSubview:btn];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
}];
[btn setImage:[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];
self.myBtn = btn;
}
return _myView;
}


当有未读消息时:

[self.myBtn setImage:[UIImage imageNamed:@"lt_ic_my_unread"] forState:UIControlStateNormal];


没有时:

[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];


原因是导航条与放置图片的button中间隔了一层button,导航条tintColor渲染不到了,大概吧,原因找到了再贴。

至此,小马述一家之言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: