今天在学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渲染不到了,大概吧,原因找到了再贴。
至此,小马述一家之言。