ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解

本文主要给大家介绍了关于iOS如何给View添加指定位置边框线的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

略微封装了一下,给View添加指定位置的边框线,其中位移枚举的使用询问了哥们儿,总算搞定;

示例代码

封装一:直接封装成了一个方法

/// 边框类型(位移枚举)

typedef NS_ENUM(NSInteger, UIBorderSideType) {

UIBorderSideTypeAll = 0,

UIBorderSideTypeTop = 1 << 0,

UIBorderSideTypeBottom = 1 << 1,

UIBorderSideTypeLeft = 1 << 2,

UIBorderSideTypeRight = 1 << 3,

};

/**

设置view指定位置的边框

@param originalView 原view

@param color 边框颜色

@param borderWidth 边框宽度

@param borderType 边框类型 例子: UIBorderSideTypeTop|UIBorderSideTypeBottom

@return view

*/

- (UIView *)borderForView:(UIView *)originalView color:(UIColor *)color borderWidth:(CGFloat)borderWidth borderType:(UIBorderSideType)borderType {

if (borderType == UIBorderSideTypeAll) {

originalView.layer.borderWidth = borderWidth;

originalView.layer.borderColor = color.CGColor;

return originalView;

}

/// 线的路径

UIBezierPath * bezierPath = [UIBezierPath bezierPath];

/// 左侧

if (borderType & UIBorderSideTypeLeft) {

/// 左侧线路径

[bezierPath moveToPoint:CGPointMake(0.0f, originalView.frame.size.height)];

[bezierPath addLineToPoint:CGPointMake(0.0f, 0.0f)];

}

/// 右侧

if (borderType & UIBorderSideTypeRight) {

/// 右侧线路径

[bezierPath moveToPoint:CGPointMake(originalView.frame.size.width, 0.0f)];

[bezierPath addLineToPoint:CGPointMake( originalView.frame.size.width, originalView.frame.size.height)];

}

/// top

if (borderType & UIBorderSideTypeTop) {

/// top线路径

[bezierPath moveToPoint:CGPointMake(0.0f, 0.0f)];

[bezierPath addLineToPoint:CGPointMake(originalView.frame.size.width, 0.0f)];

}

/// bottom

if (borderType & UIBorderSideTypeBottom) {

/// bottom线路径

[bezierPath moveToPoint:CGPointMake(0.0f, originalView.frame.size.height)];

[bezierPath addLineToPoint:CGPointMake( originalView.frame.size.width, originalView.frame.size.height)];

}

CAShapeLayer * shapeLayer = [CAShapeLayer layer];

shapeLayer.strokeColor = color.CGColor;

shapeLayer.fillColor = [UIColor clearColor].CGColor;

/// 添加路径

shapeLayer.path = bezierPath.CGPath;

/// 线宽度

shapeLayer.lineWidth = borderWidth;

[originalView.layer addSublayer:shapeLayer];

return originalView;

}

封装二:封装成了类别

.h内容

#import typedef NS_OPTIONS(NSUInteger, UIBorderSideType) {

UIBorderSideTypeAll = 0,

UIBorderSideTypeTop = 1 << 0,

UIBorderSideTypeBottom = 1 << 1,

UIBorderSideTypeLeft = 1 << 2,

UIBorderSideTypeRight = 1 << 3,

};

@interface UIView (BorderLine)

- (UIView *)borderForColor:(UIColor *)color borderWidth:(CGFloat)borderWidth borderType:(UIBorderSideType)borderType;

@end

.m内容

#import "UIView+BorderLine.h"

@implementation UIView (BorderLine)

- (UIView *)borderForColor:(UIColor *)color borderWidth:(CGFloat)borderWidth borderType:(UIBorderSideType)borderType {

if (borderType == UIBorderSideTypeAll) {

self.layer.borderWidth = borderWidth;

self.layer.borderColor = color.CGColor;

return self;

}

/// 左侧

if (borderType & UIBorderSideTypeLeft) {

/// 左侧线路径

[self.layer addSublayer:[self addLineOriginPoint:CGPointMake(0.f, 0.f) toPoint:CGPointMake(0.0f, self.frame.size.height) color:color borderWidth:borderWidth]];

}

/// 右侧

if (borderType & UIBorderSideTypeRight) {

/// 右侧线路径

[self.layer addSublayer:[self addLineOriginPoint:CGPointMake(self.frame.size.width, 0.0f) toPoint:CGPointMake( self.frame.size.width, self.frame.size.height) color:color borderWidth:borderWidth]];

}

/// top

if (borderType & UIBorderSideTypeTop) {

/// top线路径

[self.layer addSublayer:[self addLineOriginPoint:CGPointMake(0.0f, 0.0f) toPoint:CGPointMake(self.frame.size.width, 0.0f) color:color borderWidth:borderWidth]];

}

/// bottom

if (borderType & UIBorderSideTypeBottom) {

/// bottom线路径

[self.layer addSublayer:[self addLineOriginPoint:CGPointMake(0.0f, self.frame.size.height) toPoint:CGPointMake( self.frame.size.width, self.frame.size.height) color:color borderWidth:borderWidth]];

}

return self;

}

- (CAShapeLayer *)addLineOriginPoint:(CGPoint)p0 toPoint:(CGPoint)p1 color:(UIColor *)color borderWidth:(CGFloat)borderWidth {

/// 线的路径

UIBezierPath * bezierPath = [UIBezierPath bezierPath];

[bezierPath moveToPoint:p0];

[bezierPath addLineToPoint:p1];

CAShapeLayer * shapeLayer = [CAShapeLayer layer];

shapeLayer.strokeColor = color.CGColor;

shapeLayer.fillColor = [UIColor clearColor].CGColor;

/// 添加路径

shapeLayer.path = bezierPath.CGPath;

/// 线宽度

shapeLayer.lineWidth = borderWidth;

return shapeLayer;

}

@end

用法:

UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(80.0f, 80.0f, 200.0f, 100.0f)];

testView.backgroundColor = [UIColor lightGrayColor];

[self.view addSubview:testView];

[self borderForView:testView color:[UIColor redColor] borderWidth:1.0f borderType:UIBorderSideTypeTop | UIBorderSideTypeBottom];

效果:

bee9d662c0f975f4dae410e38be59792.png

不足之处,边框线过宽的话,交界处会有留白;

ps:注意:需要先把你的view加载在父view上,[self.view addSubview:testView]; 之后再设置边框;否则可能会不起作用的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mfc 设置子窗口只打开一遍_MFC 判断子窗体是不是已经打开,避免重复创建

MFC 判断子窗体是否已经打开&#xff0c;避免重复创建在主窗体中&#xff0c;嵌入一个很多个子窗体&#xff0c;但是&#xff0c;每次只显示一个。我的做法是&#xff0c;首先在主窗体头文件中定义子窗体对象&#xff0c;然后在单击显示按钮的时候&#xff0c;先判断子窗体是否…

【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞

2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][Discuss]Description Abstinence岛上的居民很喜欢饮用纯酿的啤酒。迄今为止&#xff0c;他们都是从波兰进口啤酒&#xff0c;自己不生产。但今年岛上的一个城市决定…

python以下导入包的格式错误的是_ICMP python上的错误数据包

如何创建帧icmp我在python上标记格式错误的包导入套接字&#xff0c;结构&#xff0c;uuid&#xff0c;子进程&#xff0c;fcntl&#xff0c;time&#xff0c;random列表项from binascii import hexlify&#xff0c;unexlify from datetime导入datetimetarRed原始输入(Ingrese …

win7/8/10安装过程中将动态磁盘转为basic

在分区界面运行ShiftF10在命令窗口运行Diskpartlist diskpartselect disk n(n为磁盘号)cleanconvert xxxPS:xxx代表要转换的结果。基本类型&#xff1a;Basic&#xff1b;动态类型&#xff1a;dynamic&#xff1b;MBR磁盘&#xff1a;MBR&#xff1b;GPT磁盘&#xff1a;GPT转载…

2016年4月 之 《C程序设计语言》

C程序设计语言 转载于:https://www.cnblogs.com/maoxiaowai/p/5404308.html

python绘画音频_人工智能下的音频还能这样玩!!!!

人工智能音频处理库—librosa(安装与使用)序言一、libsora安装pypicondasource二、librosa常用功能核心音频处理函数音频处理频谱表示幅度转换时频转换特征提取绘图显示三、常用功能代码实现读取音频提取特征提取Log-Mel Spectrogram 特征提取MFCC特征绘图显示绘制声音波形绘制…

保存到数据库乱码mysql_Linux下MySQL保存进去数据为乱码的解决办法

MySQL默认的字符编码是latin1,而我用的是utf-8,存入数据库就变成了?????这样的乱码&#xff0c;解决方法&#xff1a;1、windows下:修改my.ini文件&#xff0c;有两处default-character-setlatin1都改为default-character-setutf8重启既可。2、linux下&#xff1a;vi /etc…

Oracle创建表_01

1、 --创建表 create table zctest( id number(9) not null primary key, classname varchar2(40) not null) 2、 3、 转载于:https://www.cnblogs.com/dbskill/p/5407146.html

mySQL数据库中的备份代码_MySQL中的备份数据库

我目前正在学习SQL。我在windows 10-cmd上运行mysql 8.0.16cli,我以root mysql用户身份登录,并以管理员身份运行cmd。我想做的是备份我新创建的数据库。这是我的显示数据库输出:mysql> show databases;--------------------| Database |--------------------| information_s…

网页版四则运算(未全部完成)

这次作业一直在做&#xff0c;一直在拖着&#xff0c;总感觉心里亏欠点什么&#xff0c;但是人就是这样&#xff0c;一件事情本来做起来就没有太多成功的几率&#xff0c;就想着延长工期&#xff0c;那就一直拖着吧&#xff0c;拖得时间越久你就会越发清晰地意识到自己已经非常…

webapp 微信开发适配问题

文章摘自&#xff1a;http://www.cnblogs.com/oksite/p/4630462.html 前段时间由于公司要做微信app 前端主要有我一个人独立开发 分享一下自己独立开发微信app的一些经验 首先说下 适配兼容的问题&#xff1b; 主要的问题还是安卓手机参差不齐&#xff0c;每个手机都有自带一个…

python安装copy_python中copy和deepcopy 的区别

请简述赋值&#xff0c; 深拷贝和浅拷贝的区别?(python中如何拷贝一个对象?)直接赋值(li1 li): 只传递对象的引用&#xff0c; li1指向对象li的内存地址空间,因此&#xff0c; 原有列表li改变&#xff0c; 被赋值的li1也会做相应的改变.浅拷贝:li和li2的内存地址不同,但是子…

iOS中的小知识点

1.tableView隐藏滚动条 self.tableView.showsVerticalScrollIndicator NO; 2.关于属性 使用assign: 对基础数据类型 &#xff08;NSInteger&#xff0c;CGFloat&#xff09;和C数据类型&#xff08;int, float, double, char, 等等&#xff09; 使用copy&#xff1a; 对NSStri…

一个DataGridView辅助类

DataGridView是在用C#做windows界面程序时常用到的控件,DataGridView的功能非常多,用起来也非常复杂 例如1. 我想在每行前面显示行编号,则需要先设置RowHeadersVisible为true,然后,在添加RowPostPaint事件,而RowPostPaint写起来也大同小异,这就非常没有必要.期望一个DataGridVi…

java单例设计模式_Java设计模式之单例模式详解

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发同事都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)

接着上篇了解一下java压缩实现过程&#xff0c;下面的是支持 单文件 或 文件夹 压缩的实现&#xff0c;使用递归。效果&#xff1a;代码&#xff1a;package com.gx.compress;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;imp…

学习笔记day5:inline inline-block block区别

1. block元素可以包含block元素和inline元素&#xff1b;但inline元素只能包含inline元素。要注意的是这个是个大概的说法&#xff0c;每个特定的元素能包含的元素也是特定的&#xff0c;所以具体到个别元素上&#xff0c;这条规律是不适用的。比如 P 元素&#xff0c;只能包含…

java处理中文字符串_Java实现读取文章中重复出现的中文字符串

在上个星期阿里巴巴一面的时候&#xff0c;最后面试官问我如何把一篇文章中重复出现的词或者句子找出来&#xff0c;当时太紧张&#xff0c;答的不是很好。今天有时间再来亲手实现一遍。其实说白了也就是字符串的处理&#xff0c;所以难度并不是很大。以下是代码和运行效果&…

python的collection系列-默认字典(defaultdict)

默认字典&#xff0c;能定义默认值为其他类型 1 #dic1 {}2 #dic1["k1"].append("kkkkk") #正常情况会报错3 #print(dic1)4 5 import collections6 dic collections.defaultdict(list) #指定字典的值为列表7 dic["k1"].append("…

jquery获取java对象的属性_jQuery - 获得内容和属性

jQuery - 获得内容和属性jQuery 拥有可操作 HTML 元素和属性的强大方法。jQuery DOM 操作jQuery 中非常重要的部分&#xff0c;就是操作 DOM 的能力。jQuery 提供一系列与 DOM 相关的方法&#xff0c;这使访问和操作元素和属性变得很容易。提示&#xff1a;DOM Document Objec…