一句话笔记(02)

一句话笔记,某段时间内遇到或看到的某个可记录的点。 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这是定义了一个指针 keykey可以指向任意类型的值,但它指向的值必须是常量。在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。

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 的巧用,确实很巧。

你可能感兴趣的:(一句话笔记(02))