一句话笔记(04)

一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-8-6

  • 1、修改button 点中后的高亮状态的颜色
  • 2、KVC 中 forKey,forKeyPath的区别
  • 3、Category 不需要引用了,可以直接使用
  • 4、UILabel 中文字居右时的留空格
1、修改button 点中后的高亮状态的颜色

说明一下,此处不是直接修改背景颜色, 下面这个是网上流传的方法,不过有时是有用的,但此处不是我的需求。

- (void)viewDidLoad {
    [super viewDidLoad];
     
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(60, 100, 200, 40)];
    [button setTitle:@"button" forState:UIControlStateNormal];
    [button setBackgroundImage:[self imageWithColor:[UIColor redColor]] forState:UIControlStateNormal];
    [button setBackgroundImage:[self imageWithColor:[UIColor grayColor]] forState:UIControlStateHighlighted];
    [self.view addSubview:button];
}
 
//  颜色转换为背景图片
- (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

经过后面我的需求,唯有通过增加图片才得以解决:

[button setImage:[UIImage imageNamed:@"normal_pic"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"highlighted_pic"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"selected_pic"] forState:UIControlStateSelected];

当然实际上,我这边这个需求的理解也可以直接将点中后的高亮状态的颜色变为没有:

[button setAdjustsImageWhenHighlighted:NO];

具体的还是看需求吧。

2、KVC 中 forKey,forKeyPath的区别

一般的修改一个对象的属性的时候,forKey和forKeyPath, 没什么区别。但是forKeyPath中可以利用运算符, 可以一层一层往下查找对象的属性 ,能够找到更深层的属性。所以用forKeyPath就行了,因为它确实更强大一些。

3、Category 不需要引用了,可以直接使用

以前我们要使用Category 必须要头文件引入一下,现在当我们创建了之后,它相当于放到我们之前的那个pch文件中,也就是全局引用了。但是往往有时候里面我们没有写好的情况下,一不注意就出错了,一下子不知道错误在哪里,所以还是要注意一下的。

4、UILabel 中文字居右时的留空格

通常我们用UILabel 的时候,会有前面留空格或后面留空格

label.text = [NSString stringWithFormat:@"%@%@",@"  ",@"strOne"];
label.textAlignment = NSTextAlignmentLeft;

但是右边这样是是不管用的

label.text = [NSString stringWithFormat:@"%@%@",@"strOne",@"  "];
label.textAlignment = NSTextAlignmentRight;
不管用

\t就好啦

label.text = [NSString stringWithFormat:@"%@%@",@"strOne",@"\t"];
一个\t的效果

但是那个边距也不是能绝对控制距离的,要空远一点我们可以多加一个\t, \t在不同型号的手机中的显示那个距离是不一样的, 所以要精准,还是得用其他办法,自定义之类的。

常用的方法就是直接继承UILabel, 增加一个edgeInsets 属性,重写

// override points. can adjust rect before calling super.
// label has default content mode of UIViewContentModeRedraw
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;
- (void)drawTextInRect:(CGRect)rect;

然后设置。下面是模仿iOS-设置UILabel的内边距所写的一个继承UILabel:

#import 

@interface YSLabel : UILabel

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end
#import "YSLabel.h"

@implementation YSLabel

- (instancetype)initWithFrame:(CGRect)frame {
    if(self = [super initWithFrame:frame]) {
        _edgeInsets = UIEdgeInsetsMake(0, 0, 0, 20);
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        _edgeInsets = UIEdgeInsetsMake(0, 0, 0, 20);
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 20);
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
    
    CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,
                                                                 _edgeInsets) limitedToNumberOfLines:numberOfLines];
    //根据edgeInsets,修改绘制文字的bounds
    rect.origin.x -= _edgeInsets.left;
    rect.origin.y -= _edgeInsets.top;
    rect.size.width += _edgeInsets.left + _edgeInsets.right;
    rect.size.height += _edgeInsets.top + _edgeInsets.bottom;
    return rect;
}

//绘制文字
- (void)drawTextInRect:(CGRect)rect
{
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, _edgeInsets)];
}

@end

当然此处我是先写死设置靠右距离20的。如果需要额外设置,我们直接在外部设置edgeInsets就OK啦。

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