IOS知识点

1、UITableView 顶部状态栏设置颜色

之前研究了UIScrollView,在一个Controller 中直接使用[self.view addSubview:]添加UIScrollView时,会自动留出顶部状态栏高度。而通常预留出来的白色空间并非我们想要的,在UIScrollView时,我们直接设置了self.view的颜色,而在UITableView 的情况下不再适用了。

查看View 层次结构发现UITableView 自动添加了不透明背景,于是陷入了思考陷阱:设置UITableView 的adjustedContentInset ? 只能适配Iphone x和Iphone 8?

最终终于跳出了思考陷阱,直接将UITableView的背景颜色设置为TintColer。

2、KSCycleBannerView 在UITableView 中和UIView 中的不同表现

直接将一个KSCycleBannerView 添加到UIView 中,加载的图片上下是可以拖动的。而将其添加到UITableView中,只能左右滑动。

3、UIView的圆角 设置圆角一直是直接为.layer.cornerRadius属性赋值,今天有个需求是为一个View 添加左下和右下圆角,而左上和右上不变。

想当然的以为.layer.radius_bottom_left等属性存在,结果失望了。

在网上找到两篇参考文献iOS 实现半边圆角或部分圆角 , iOS设置圆角的四种方法

要想实现部分圆角,可以为视图的layer 添加一个mask,这样将mask覆盖到layer上就会显示圆角的效果。

//通过贝塞尔曲线生成
CAShapeLayer *mask = [CAShapeLayer new];
mask.path = [UIBezierPath bezierPathWithOvalInRect:view.bounds].CGPath;
view.layer.mask = mask;

中调就在view.bounds 的获取上了,在如上参考文献中,为UIView添加了一个分类,这样就可以直接添加部分圆角了。核心代码如下:

// category 
- (void)addRoundedCorners:(UIRectCorner)corners
                withRadii:(CGSize)radii {    
    UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:radii];
    CAShapeLayer* shape = [[CAShapeLayer alloc] init];
    [shape setPath:rounded.CGPath];
    
    self.layer.mask = shape;
}

// 使用
_blackBGimageView = [[UIImageView alloc] init];
[_blackBGimageView addRoundedCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight  withRadii:CGSizeMake(5.0, 5.0) viewRect:CGRectMake(0, 0, ((SCREEN_WIDTH - 4*10)/2.0), 35)];

4、UIButton 文本不居中的调试

参考 Diary 2017-12-11

前面介绍过,通过UIButton 的imageEdgeInsets, titleEdgeInsets, contentVerticalAlignment , contentHorizontalAlignment 属性配合使用可以实现UIButton 文本居于图片之下并实现居中,今天设置了一个button,结果文本并未如想象中一样居中。想要实现的效果如下:

20171214151326468339982.png

图片宽度为 94p,于是为button设置了 100 p的宽度,按照之前的方法直接调用,发现实现后文本确实在图片下面,但是靠右对齐了(图略)。

经过调试分析,发现当为UIButton设置了图文之后,由于默认状态下图文是左右排放的,文本被缩减为省略号。之后所有的计算都是以缩略之后的label大小为基础进行计算的。

修改方案:
本来以为只能通过手动计算label大小来设置imageEdgeInsets, titleEdgeInsets,突然想到了可以提前设置titleEdgeInsets 的右边距为足够大的负数,这样就可以完整的显示UILabel了,在计算是否就正常了呢?于是在原来代码基础上加了如下一行button.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -750); 将UILabel 的右边距设置为 -750。完整代码如下:


+(void) setBtnTextBelow:(UIButton*) button with:(CGFloat) spacing{
    button.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -750 hrpx);
    CGFloat imageTop = (button.frame.size.height-button.imageView.frame.size.height-button.titleLabel.frame.size.height -spacing)/2;
    CGFloat titleTop = imageTop + button.imageView.frame.size.height +spacing;
    
    CGFloat imageLeft = (button.frame.size.width-button.imageView.frame.size.width)/2;
    // 这里减了image.width,因为title的left是以image的left为参考
    CGFloat titleLeft = (button.frame.size.width-button.titleLabel.frame.size.width)/2-button.imageView.frame.size.width;
//    CGFloat titleLeft = (button.frame.size.width-button.titleLabel.frame.size.width)/2;
    
    //输出 76.176000, 19.666667, 47.000000
    NSLog(@"%f, %f, %f", button.frame.size.width, button.titleLabel.frame.size.width, button.imageView.frame.size.width);

    button.imageEdgeInsets = UIEdgeInsetsMake(imageTop, imageLeft, 0, 0);
    button.titleEdgeInsets = UIEdgeInsetsMake(titleTop, titleLeft, 0, 0);
    
    button.contentVerticalAlignment = 1;
    button.contentHorizontalAlignment = 1;
}

后记

想做个能抓取网页并自动过滤广告的应用。