一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-7-20
- 修改SearchBar 的Cancel 颜色或文字
- _cmd的一种巧用
- 抗锯齿的两种方法
- 修改TableView 滑动时的删除按钮的文字
1、修改SearchBar 的Cancel 颜色或文字
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
[searchBar setShowsCancelButton:YES animated:YES];
/**
修改UISearchBar右侧的取消按钮文字颜色
注意是 UISearchBar 的subView 中的SubViews层次
此处需要优化,因为苹果不定什么时候,把这个层次变化啦
*/
for (UIView *searchbuttons in [searchBar.subviews.firstObject subviews]){
if ([searchbuttons isKindOfClass:[UIButton class]]) {
UIButton *cancelButton = (UIButton*)searchbuttons;
// 修改文字颜色
[cancelButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
// 设置国际化语言
[cancelButton setTitle:NSLocalizedString(@"cancle", nil) forState:UIControlStateNormal];
}
}
}
/**
* 这个方法是系统给的,相应来说是安全的
*/
if (ABOVE_IOS9) { // 大于iOS 9 的情况下
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]];
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitle:NSLocalizedString(@"cancle", nil)];
}
else {
[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];
[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTitle:NSLocalizedString(@"cancle", nil)];
}
以前用的方法是通过view 的层次去改变,非常取巧,后一种是系统自带的,所以是OK的。
2、_cmd的一种巧用
_cmd
是隐藏的参数,代表当前方法的 selector
。在用分类扩展属性的时候,发现了一种对 const void *key
的巧妙用法。
* @param key The key for the association.
同时先了解下const void *key
这是定义了一个指针 key
,key
可以指向任意类型的值,但它指向的值必须是常量。在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。
static char kCanHideMenuKey;
- (void)setYs_canHideMenu:(BOOL)ys_canHideMenu {
objc_setAssociatedObject(self, &kCanHideMenuKey, @(ys_canHideMenu), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)ys_canHideMenu {
id canHideMenu = objc_getAssociatedObject(self,&kCanHideMenuKey);
if (!canHideMenu) objc_setAssociatedObject(self, &kCanHideMenuKey, @(NO), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return [objc_getAssociatedObject(self, &kCanHideMenuKey) boolValue];
}
原先我们常用的&kCanHideMenuKey
的方法,现在我们可以用_cmd
代替。
- (void)setYs_canHideMenu:(BOOL)ys_canHideMenu {
objc_setAssociatedObject(self, @selector(ys_canHideMenu), @(ys_canHideMenu), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)ys_canHideMenu {
id canHideMenu = objc_getAssociatedObject(self, _cmd);
if (!canHideMenu) objc_setAssociatedObject(self, @selector(ys_canHideMenu), @(NO), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
从具体的用法中可以看出, _cmd
@selector(Method)
直接替代了那个key。
3、抗锯齿的两种方法
有时候我们,我们处理图片的时候回产生边缘不整齐的感觉,也就是锯齿的感觉啦。
view.layer.allowsEdgeAntialiasing = YES;
view.layer.borderColor = [UIColor clearColor].CGColor;
view.layer.borderWidth = 1.f;
第一种是对单个 Layer 开启抗锯齿的方法,第二种留一个像素的透明边。来自:@里脊串
4、修改TableView 滑动时的删除按钮的文字
// 修改删除文字
- (NSString*)tableView:(UITableView*)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath*)indexpath {
return NSLocalizedString(@"delete", nil);
}
之前对于这个方法没有用到过,但是iOS 8 之后同时使用下面这个方法后,上面这个方法就失效啦。当然单独使用是OK的。
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
// 添加一个删除按钮
UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive
title:@"Delete"
handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
NSLog(@"点击了删除");
// 1. 更新数据
[self.dataArray removeObjectAtIndex:indexPath.row];
// 2. 更新UI
[tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationAutomatic];
}];
return @[deleteRowAction];
}
印象比较深的是_cmd 的巧用,确实很巧。