iOS 显示圆角、阴影和边框

news/2024/7/20 20:13:45 标签: ios, objective-c, xcode

iOS 同时显示圆角(部分)、阴影和边框

在 iOS 开发中,让View显示圆角和阴影以及边框

方法1:系统的UIView

 UIView *v=[[UIView alloc]initWithFrame:CGRectMake(100, 200, viewWidth, viewHeight)];
    v.backgroundColor=[UIColor yellowColor];
//	v.layer.masksToBounds=YES;//这行去掉才行
 
    v.layer.cornerRadius=cornerRadius;
 
    v.layer.shadowColor=[UIColor redColor].CGColor;
    v.layer.shadowOffset=CGSizeMake(0, 0);
    v.layer.shadowOpacity=1;
    v.layer.shadowRadius=5;
 
    v.layer.borderWidth = 2;
    v.layer.borderColor = [UIColor blueColor].CGColor;
    [self.view addSubview:v];

UIView的缺点: 只能v.layer.masksToBounds=NO,v.clipsToBounds = NO;

即子view如果超过View的边界不会裁剪,也不能只显示部分圆角

方法2:

定义一个新的View,重写view的layoutSubviews方法

//核心代码,设置部分圆角
-(void)layoutSubviews{
    [super layoutSubviews];
    //cornerType可以由外界传入,是UIRectCorner枚举类型变量
    //radius可以由外界传入
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:cornerType cornerRadii:CGSizeMake(radius,radius)];
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.frame = self.bounds;
    layer.path = path.CGPath;
    self.layer.mask = layer;
 
    //设置border边框,也可以部分圆角
    //_borderWidth和_borderColor由外界传入
    // 这个地方的path和自定义view的layer的path相同
    CAShapeLayer* borderLayer = [CAShapeLayer layer];
    borderLayer.lineWidth = _borderWidth;
    borderLayer.path = path.CGPath;
    borderLayer.fillColor = [UIColor clearColor].CGColor;
    borderLayer.strokeColor = _borderColor;
    borderLayer.frame = self.bounds;
    [self.layer addSublayer:borderLayer];
}

使用同方法1,可以设置部分圆角,但不能显示阴影(受mask的影响,就算设置了layer的shadow属性也会被layoutSubviews方法中的代码覆盖)

方法3:

定义一个新的View,view的layer属性类型用CAShapeLayer代替CALayer

#import "RoundCornerView.h"
 
@implementation RoundCornerView
 
//核心代码,view的layer属性类型用CAShapeLayer代替CALayer
+ (Class)layerClass {
    return [CAShapeLayer class];
}
 
//重新init方法,背景颜色赋一个默认值
- (instancetype)init
{
    self = [super init];
    if (self) {
        if ([self.layer isKindOfClass:[CAShapeLayer class]]) {
            ((CAShapeLayer *)self.layer).fillColor = [UIColor clearColor].CGColor;
        }
    }
    return self;
}
 
//核心代码,设置部分圆角
-(void)layoutSubviews{
    [super layoutSubviews];
    //UIRectCornerType可以由外界传入,是UIRectCorner枚举类型变量
    //radius可以由外界传入
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerTypecornerRadii:CGSizeMake(radius,radius)];
    if ([self.layer isKindOfClass:[CAShapeLayer class]]) {
        ((CAShapeLayer *)self.layer).path = maskPath.CGPath;
    }
//	self.clipsToBounds = YES;//去掉这行才行
 
    //设置border边框,也可以部分圆角
    //_borderWidth和_borderColor由外界传入
    // 这个地方的path和自定义view的layer的path相同
    CAShapeLayer* borderLayer = [CAShapeLayer layer];
    borderLayer.lineWidth = _borderWidth;
    borderLayer.path = maskPath.CGPath;
    borderLayer.fillColor = [UIColor clearColor].CGColor;
    borderLayer.strokeColor = _borderColor;
    borderLayer.frame = self.bounds;
    [self.layer addSublayer:borderLayer];
}
 
//背景颜色不是直接赋值给view.backgroundColor
- (void)setBackgroundColor:(UIColor *)backgroundColor {
    ((CAShapeLayer *)self.layer).fillColor = backgroundColor.CGColor;
}
@end

然后可以随心所欲的设置阴影了,并且不受mask的影响

RoundCornerView* shapeView = [[ShapeView alloc] init];
shapeView.backgroundColor = [UIColor grayColor];
shapeView.layer.shadowColor = [UIColor redColor].CGColor;
shapeView.layer.shadowRadius = 5.f;
shapeView.layer.shadowOffset = CGSizeMake(0.f, 0.f);
shapeView.layer.shadowOpacity = 1.f;
shapeView.frame = CGRectMake(100, 200, 500, 100);
[self.view addSubview:shapeView];

优点:可以只显示部分圆角,可以显示阴影

缺点:超过父View的边界不会裁剪

方法4:

可以在一个 View 里只应用一种效果,然后通过组合的方式达到效果。

层次结构:

roundCornerView:显示圆角,放在上层

shadowView: 显示阴影,放在底层

@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    //两个View,父View负责阴影,子View负责圆角,父View背景透明,这样叠加起来就可以既有圆角又有阴影
     
    ShadowView *shadowView = [[ShadowView alloc] initWithFrame:CGRectMake(150, 250, viewWidth, viewHeight)];
    shadowView.layer.backgroundColor = [UIColor clearColor].CGColor;
    shadowView.layer.shadowColor = [UIColor blackColor].CGColor;
    shadowView.layer.shadowOpacity = 1;
    shadowView.layer.shadowOffset = CGSizeMake(0, 0);
    shadowView.layer.shadowRadius = 5;
 
    RoundCornerView *roundCornerView = [[RoundCornerView alloc] initWithFrame:CGRectMake(0, 0, viewWidth, viewHeight)];
    roundCornerView.backgroundColor = [UIColor blueColor];
 
    roundCornerView.radius = cornerRadius;
    roundCornerView.cornerType = UIRectCornerTopLeft | UIRectCornerBottomLeft;
 
    roundCornerView.borderWidth = borderWidth;
    roundCornerView.borderColor = [UIColor blueColor].CGColor;
 
    [self.view addSubview:shadowView];
    [shadowView addSubview:roundCornerView];
}
@end

如果roundCornerView像方法2一样重写了layoutSubviews方法,那么方法4就可以显示部分圆角和阴影和边框了,而且超过父View的边界可以裁剪


http://www.niftyadmin.cn/n/905307.html

相关文章

Windows上提高工作效率的神器推荐

Everything 下载地址:http://www.voidtools.com/功能:硬盘文件搜索,比起电脑自带的文件搜索,效率提高不是一丁半点。而且Everything还支持正则表达式,小巧而快速;Clover 下载地址:http://cn.eji…

keychain介绍

1. keychain概述 1.1 keychain是什么 苹果官网对钥匙串的描述 iOS keychain 是一个相对独立的空间,是用SQLite进行存储的,可以加密我们保存的数据,并且使用keychain service API增删改查。 keychain的是以item为单位存储的。data是数据本身…

@codeforces - 786E@ ALT

目录 description - translationsolutionpart - 1part - 2part - 3accepted codedetailsdescription - translation 给定一棵含 n 个点的树和 m 个人,第 i 个人会从结点 xi 走到 结点 yi。 每个人有一个需求:要么他开局自带一条狗,要么他走的…

gitLab创建自己的私有库

1.在gitlab上创建私有库 code repository,代码仓库,克隆code repository到本地并添加工程CXTool,上传所有文件到远端的库中并打tag git add . git commit -m 你的修改记录 git remote add origin 代码仓库地址 // 在push之前, 查看spec是否配…

mDNS故障排查(译)

WLC上mDNS网关的理解及排查 第一部分:介绍 这篇文档描述了Bonjour协议在WLC上的操作,该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导。 第二部分:需求和前提 知识需求: Cisco建议你对Bonjour协议、在WLC配置mDN…

Masonry

Masonry框架的优点 Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁。 基于NSLayoutConstraint的布局实现subView.top superView.top * 1 10 subView.translatesAutoresizingMaskIntoConstraints NO;//关闭自动…

前端面试手册

分别从HTML、CSS、JavaScript、综合四个方面总结,后续持续更新 HTML部分 Doctype的作用?文档声明,不存在或格式不正确会导致文档以兼容模式呈现标准模式的排版和JS运作模式都是以该浏览器支持的最高标准运行兼容模式页面以宽松的向后兼容的方…

MJExtension用法及源码解析

MJExtension介绍 1.MJExtension是一套字典和模型之间互相转换的超轻量级框架 2.MJExtension能完成的功能 字典(JSON) --> 模型(Model) 模型(Model) --> 字典(JSON) 字典数…