Swift:UIView+Extension
2020-11-08 本文已影响0人
IIronMan
JKSwiftExtension,测试用例在 UIViewExtensionViewController.swift 里面
目录:
1、UIView 有关 Frame 的扩展
2、继承于 UIView 视图的 平面、3D 旋转 以及 缩放
3、关于UIView的 圆角 和 阴影的设置
4、自定义链式编程
5、其他的方法
一、UIView 有关 Frame 的扩展
// MARK:- 三、UIView 有关 Frame 的扩展
extension UIView: JKPOPCompatible {}
public extension JKPOP where Base : UIView {
// MARK: 3.1、x 的位置
/// x 的位置
var x: CGFloat {
get {
return base.frame.origin.x
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.origin.x = newValue
base.frame = tempFrame
}
}
// MARK: 3.2、y 的位置
/// y 的位置
var y: CGFloat {
get {
return base.frame.origin.y
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.origin.y = newValue
base.frame = tempFrame
}
}
// MARK: 3.3、height: 视图的高度
/// height: 视图的高度
var height: CGFloat {
get {
return base.frame.size.height
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.size.height = newValue
base.frame = tempFrame
}
}
// MARK: 3.4、width: 视图的宽度
/// width: 视图的宽度
var width: CGFloat {
get {
return base.frame.size.width
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.size.width = newValue
base.frame = tempFrame
}
}
// MARK: 3.5、size: 视图的zize
/// size: 视图的zize
var size: CGSize {
get {
return base.frame.size
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.size = newValue
base.frame = tempFrame
}
}
// MARK: 3.6、centerX: 视图的X中间位置
/// centerX: 视图的X中间位置
var centerX: CGFloat {
get {
return base.center.x
}
set(newValue) {
var tempCenter: CGPoint = base.center
tempCenter.x = newValue
base.center = tempCenter
}
}
// MARK: 3.7、centerY: 视图的Y中间位置
/// centerY: 视图Y的中间位置
var centerY: CGFloat {
get {
return base.center.y
}
set(newValue) {
var tempCenter: CGPoint = base.center
tempCenter.y = newValue
base.center = tempCenter;
}
}
// MARK: 3.8、center: 视图的中间位置
/// centerY: 视图Y的中间位置
var center: CGPoint {
get {
return base.center
}
set(newValue) {
var tempCenter: CGPoint = base.center
tempCenter = newValue
base.center = tempCenter;
}
}
// MARK: 3.9、top 上端横坐标(y)
/// top 上端横坐标(y)
var top: CGFloat {
get {
return base.frame.origin.y
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.origin.y = newValue
base.frame = tempFrame
}
}
// MARK: 3.10、left 左端横坐标(x)
/// left 左端横坐标(x)
var left: CGFloat {
get {
return base.frame.origin.x
}
set(newValue) {
var tempFrame: CGRect = base.frame
tempFrame.origin.x = newValue
base.frame = tempFrame
}
}
// MARK: 3.11、bottom 底端纵坐标 (y + height)
/// bottom 底端纵坐标 (y + height)
var bottom: CGFloat {
get {
return base.frame.origin.y + base.frame.size.height
}
set(newValue) {
base.frame.origin.y = newValue - base.frame.size.height
}
}
// MARK: 3.12、right 底端纵坐标 (x + width)
/// right 底端纵坐标 (x + width)
var right: CGFloat {
get {
return base.frame.origin.x + base.frame.size.width
}
set(newValue) {
base.frame.origin.x = newValue - base.frame.size.width
}
}
}
二、继承于 UIView 视图的 平面、3D 旋转 以及 缩放
// MARK:- 四、继承于 UIView 视图的 平面、3D 旋转 以及 缩放
/**
从m11到m44定义的含义如下:
m11:x轴方向进行缩放
m12:和m21一起决定z轴的旋转
m13:和m31一起决定y轴的旋转
m14:
m21:和m12一起决定z轴的旋转
m22:y轴方向进行缩放
m23:和m32一起决定x轴的旋转
m24:
m31:和m13一起决定y轴的旋转
m32:和m23一起决定x轴的旋转
m33:z轴方向进行缩放
m34:透视效果m34= -1/D,D越小,透视效果越明显,必须在有旋转效果的前提下,才会看到透视效果
m41:x轴方向进行平移
m42:y轴方向进行平移
m43:z轴方向进行平移
m44:初始为1
*/
extension JKPOP where Base : UIView {
// MARK: 4.1、平面旋转
/// 平面旋转
/// - Parameters:
/// - angle: 旋转多少度
/// - isInverted: 顺时针还是逆时针,默认是顺时针
public func setRotation(_ angle: CGFloat, isInverted: Bool = false) {
self.base.transform = isInverted ? CGAffineTransform(rotationAngle: angle).inverted() : CGAffineTransform(rotationAngle: angle)
}
// MARK: 4.2、沿X轴方向旋转多少度(3D旋转)
/// 沿X轴方向旋转多少度(3D旋转)
/// - Parameter angle: 旋转角度,angle参数是旋转的角度,为弧度制 0-2π
public func set3DRotationX(_ angle: CGFloat) {
// 初始化3D变换,获取默认值
//var transform = CATransform3DIdentity
// 透视 1/ -D,D越小,透视效果越明显,必须在有旋转效果的前提下,才会看到透视效果
// 当我们有垂直于z轴的旋转分量时,设置m34的值可以增加透视效果,也可以理解为景深效果
// transform.m34 = 1.0 / -1000.0
// 空间旋转,x,y,z决定了旋转围绕的中轴,取值为 (-1,1) 之间
//transform = CATransform3DRotate(transform, angle, 1.0, 0.0, 0.0)
//self.base.layer.transform = transform
self.base.layer.transform = CATransform3DMakeRotation(angle, 1.0, 0.0, 0.0)
}
// MARK: 4.3、沿 Y 轴方向旋转多少度(3D旋转)
/// 沿 Y 轴方向旋转多少度
/// - Parameter angle: 旋转角度,angle参数是旋转的角度,为弧度制 0-2π
public func set3DRotationY(_ angle: CGFloat) {
var transform = CATransform3DIdentity
transform.m34 = 1.0 / -1000.0
transform = CATransform3DRotate(transform, angle, 0.0, 1.0, 0.0)
self.base.layer.transform = transform
}
// MARK: 4.4、沿 Z 轴方向旋转多少度(3D旋转)
/// 沿 Z 轴方向旋转多少度
/// - Parameter angle: 旋转角度,angle参数是旋转的角度,为弧度制 0-2π
public func set3DRotationZ(_ angle: CGFloat) {
var transform = CATransform3DIdentity
transform.m34 = 1.0 / -1000.0
transform = CATransform3DRotate(transform, angle, 0.0, 0.0, 1.0)
self.base.layer.transform = transform
}
// MARK: 4.5、沿 X、Y、Z 轴方向同时旋转多少度(3D旋转)
/// 沿 X、Y、Z 轴方向同时旋转多少度(3D旋转)
/// - Parameters:
/// - xAngle: x 轴的角度,旋转的角度,为弧度制 0-2π
/// - yAngle: y 轴的角度,旋转的角度,为弧度制 0-2π
/// - zAngle: z 轴的角度,旋转的角度,为弧度制 0-2π
public func setRotation(xAngle: CGFloat, yAngle: CGFloat, zAngle: CGFloat) {
var transform = CATransform3DIdentity
transform.m34 = 1.0 / -1000.0
transform = CATransform3DRotate(transform, xAngle, 1.0, 0.0, 0.0)
transform = CATransform3DRotate(transform, yAngle, 0.0, 1.0, 0.0)
transform = CATransform3DRotate(transform, zAngle, 0.0, 0.0, 1.0)
self.base.layer.transform = transform
}
// MARK: 4.6、设置 x,y 缩放
/// 设置 x,y 缩放
/// - Parameters:
/// - x: x 放大的倍数
/// - y: y 放大的倍数
public func setScale(x: CGFloat, y: CGFloat) {
var transform = CATransform3DIdentity
transform.m34 = 1.0 / -1000.0
transform = CATransform3DScale(transform, x, y, 1)
self.base.layer.transform = transform
}
}
三、关于UIView的 圆角 和 阴影的设置
// MARK:- 五、关于UIView的 圆角、阴影、边框 的设置
public extension UIView {
// MARK: 5.1、添加圆角
/// 添加圆角
/// - Parameters:
/// - conrners: 具体哪个圆角
/// - radius: 圆角的大小
func addCorner(conrners: UIRectCorner , radius: CGFloat) {
let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: conrners, cornerRadii: CGSize(width: radius, height: radius))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.cgPath
self.layer.mask = maskLayer
}
// MARK: 5.2、给继承于view的类添加阴影
/// 给继承于view的类添加阴影
/// - Parameters:
/// - shadowColor: 阴影的颜色
/// - shadowOffset: 阴影的偏移度:CGSizeMake(X[正的右偏移,负的左偏移], Y[正的下偏移,负的上偏移]);
/// - shadowOpacity: 阴影的透明度
/// - shadowRadius: 阴影半径,默认 3
func addShadow(shadowColor: UIColor, shadowOffset: CGSize, shadowOpacity: Float, shadowRadius: CGFloat = 3) {
// 设置阴影颜色
layer.shadowColor = shadowColor.cgColor
// 设置透明度
layer.shadowOpacity = shadowOpacity
// 设置阴影半径
layer.shadowRadius = shadowRadius
// 设置阴影偏移量
layer.shadowOffset = shadowOffset
}
// MARK: 5.3、添加阴影和圆角并存
/// 添加阴影和圆角并存
/// - Parameters:
/// - conrners: 具体哪个圆角
/// - radius: 圆角大小
/// - shadowColor: 阴影的颜色
/// - shadowOffset: 阴影的偏移度:CGSizeMake(X[正的右偏移,负的左偏移], Y[正的下偏移,负的上偏移]);
/// - shadowOpacity: 阴影的透明度
/// - shadowRadius: 阴影半径,默认 3
func addCornerAndShadow(superview: UIView, conrners: UIRectCorner , radius: CGFloat = 3, shadowColor: UIColor, shadowOffset: CGSize, shadowOpacity: Float, shadowRadius: CGFloat = 3) {
let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: conrners, cornerRadii: CGSize(width: radius, height: radius))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.cgPath
self.layer.mask = maskLayer
let subLayer = CALayer()
let fixframe = self.frame
subLayer.frame = fixframe
subLayer.cornerRadius = shadowRadius
subLayer.backgroundColor = shadowColor.cgColor
subLayer.masksToBounds = false
// shadowColor阴影颜色
subLayer.shadowColor = shadowColor.cgColor
// shadowOffset阴影偏移,x向右偏移3,y向下偏移2,默认(0, -3),这个跟shadowRadius配合使用
subLayer.shadowOffset = shadowOffset
// 阴影透明度,默认0
subLayer.shadowOpacity = shadowOpacity
// 阴影半径,默认3
subLayer.shadowRadius = shadowRadius
superview.layer.insertSublayer(subLayer, below: self.layer)
}
// MARK: 5.4、添加边框
/// 添加边框
/// - Parameters:
/// - width: 边框宽度
/// - color: 边框颜色
func addBorder(borderWidth: CGFloat, borderColor: UIColor) {
layer.borderWidth = borderWidth
layer.borderColor = borderColor.cgColor
layer.masksToBounds = true
}
// MARK: 5.5、添加顶部的 边框
/// 添加顶部的 边框
/// - Parameters:
/// - borderWidth: 边框宽度
/// - borderColor: 边框颜色
func addBorderTop(borderWidth: CGFloat, borderColor: UIColor) {
addBorderUtility(x: 0, y: 0, width: frame.width, height: borderWidth, color: borderColor)
}
// MARK: 5.6、添加顶部的 内边框
/// 添加顶部的 内边框
/// - Parameters:
/// - borderWidth: 边框宽度
/// - borderColor: 边框颜色
/// - padding: 边框距离边上的距离
func addBorderTopWithPadding(borderWidth: CGFloat, borderColor: UIColor, padding: CGFloat) {
addBorderUtility(x: padding, y: 0, width: frame.width - padding*2, height: borderWidth, color: borderColor)
}
// MARK: 5.7、添加底部的 边框
/// 添加底部的 边框
/// - Parameters:
/// - borderWidth: 边框宽度
/// - borderColor: 边框颜色
func addBorderBottom(borderWidth: CGFloat, borderColor: UIColor) {
addBorderUtility(x: 0, y: frame.height - borderWidth, width: frame.width, height: borderWidth, color: borderColor)
}
// MARK: 5.8、添加左边的 边框
/// 添加左边的 边框
/// - Parameters:
/// - borderWidth: 边框宽度
/// - borderColor: 边框颜色
func addBorderLeft(borderWidth: CGFloat, borderColor: UIColor) {
addBorderUtility(x: 0, y: 0, width: borderWidth, height: frame.height, color: borderColor)
}
// MARK: 5.9、添加右边的 边框
/// 添加右边的 边框
/// - Parameters:
/// - borderWidth: 边框宽度
/// - borderColor: 边框颜色
func addBorderRight(borderWidth: CGFloat, borderColor: UIColor) {
addBorderUtility(x: frame.width - borderWidth, y: 0, width: borderWidth, height: frame.height, color: borderColor)
}
// MARK:- 5.10、画圆环
/// 画圆环
/// - Parameters:
/// - fillColor: 内环的颜色
/// - strokeColor: 外环的颜色
/// - strokeWidth: 外环的宽度
func drawCircle(fillColor: UIColor, strokeColor: UIColor, strokeWidth: CGFloat) {
let ciecleRadius = self.jk.width > self.jk.height ? self.jk.height : self.jk.width
let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: ciecleRadius, height: ciecleRadius), cornerRadius: ciecleRadius / 2)
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.fillColor = fillColor.cgColor
shapeLayer.strokeColor = strokeColor.cgColor
shapeLayer.lineWidth = strokeWidth
self.layer.addSublayer(shapeLayer)
}
}
四、自定义链式编程
// MARK:- 六、自定义链式编程
public extension UIView {
// MARK: 6.1、设置 tag 值
/// 设置 tag 值
/// - Parameter tag: 值
/// - Returns: 返回自身
@discardableResult
func tag(_ tag: Int) -> Self {
self.tag = tag
return self
}
// MARK: 6.2、设置圆角
/// 设置圆角
/// - Parameter cornerRadius: 圆角
/// - Returns: 返回自身
@discardableResult
func corner(_ cornerRadius: CGFloat) -> Self {
layer.cornerRadius = cornerRadius
layer.masksToBounds = true
return self
}
// MARK: 6.3、图片的模式
/// 图片的模式
/// - Parameter mode: 模式
/// - Returns: 返回图片的模式
@discardableResult
func contentMode(_ mode: UIView.ContentMode) -> Self {
contentMode = mode
return self
}
// MARK: 6.4、设置背景色
/// 设置背景色
/// - Parameter color: 颜色
/// - Returns: 返回自身
@discardableResult
func backgroundColor(_ color: UIColor) -> Self {
backgroundColor = color
return self
}
// MARK: 6.5、设置十六进制颜色
/// 设置十六进制颜色
/// - Parameter hex: 十六进制颜色
/// - Returns: 返回自身
@discardableResult
func backgroundColor(_ hex: String) -> Self {
backgroundColor = UIColor.hexStringColor(hexString: hex)
return self
}
// MARK: 6.6、设置 frame
/// 设置 frame
/// - Parameter frame: frame
/// - Returns: 返回自身
@discardableResult
func frame(_ frame: CGRect) -> Self {
self.frame = frame
return self
}
// MARK: 6.7、被添加到某个视图上
/// 被添加到某个视图上
/// - Parameter superView: 父视图
/// - Returns: 返回自身
@discardableResult
func addTo(_ superView: UIView) -> Self {
superView.addSubview(self)
return self
}
// MARK: 6.8、设置是否支持触摸
/// 设置是否支持触摸
/// - Parameter isUserInteractionEnabled: 是否支持触摸
/// - Returns: 返回自身
@discardableResult
func isUserInteractionEnabled(_ isUserInteractionEnabled: Bool) -> Self {
self.isUserInteractionEnabled = isUserInteractionEnabled
return self
}
// MARK: 6.9、设置是否隐藏
/// 设置是否隐藏
/// - Parameter isHidden: 是否隐藏
/// - Returns: 返回自身
@discardableResult
func isHidden(_ isHidden: Bool) -> Self {
self.isHidden = isHidden
return self
}
// MARK: 6.10、设置透明度
/// 设置透明度
/// - Parameter alpha: 透明度
/// - Returns: 返回自身
@discardableResult
func alpha(_ alpha: CGFloat) -> Self {
self.alpha = alpha
return self
}
// MARK: 6.11、设置tintColor
/// 设置tintColor
/// - Parameter tintColor: tintColor description
/// - Returns: 返回自身
@discardableResult
func tintColor(_ tintColor: UIColor) -> Self {
self.tintColor = tintColor
return self
}
}
五、其他的方法
// MARK:- 其他的方法
public extension UIView {
// MARK: 获取当前view的viewcontroller
/// 获取当前view的viewcontroller
var currentVC: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
// MARK: 添加水印
/// 添加水印
/// - Parameters:
/// - markText: 水印文字
/// - textColor: 水印文字颜色
/// - font: 水印文字大小
func addWater(markText: String, textColor: UIColor = UIColor.black, font: UIFont = UIFont.systemFont(ofSize: 12)) {
let waterMark: NSString = markText.toNSString
let textSize: CGSize = waterMark.size(withAttributes: [NSAttributedString.Key.font : font])
// 多少行
let line: NSInteger = NSInteger(self.jk.height * 3.5 / 80)
// 多少列:自己的宽度/(每个水印的宽度+间隔)
let row: NSInteger = NSInteger(self.jk.width / markText.rectWidth(font: font, size: CGSize(width: self.jk.width, height: CGFloat(MAXFLOAT))))
for i in 0..<line {
for j in 0..<row {
let textLayer: CATextLayer = CATextLayer()
// textLayer.backgroundColor = UIColor.randomColor().cgColor
//按当前屏幕分辨显示,否则会模糊
textLayer.contentsScale = UIScreen.main.scale
textLayer.font = font
textLayer.fontSize = font.pointSize
textLayer.foregroundColor = textColor.cgColor
textLayer.string = waterMark
textLayer.frame = CGRect(x: CGFloat(j) * (textSize.width + 30), y: CGFloat(i) * 60, width: textSize.width, height: textSize.height)
// 旋转文字
textLayer.transform = CATransform3DMakeRotation(CGFloat(Double.pi*0.2), 0, 0, 3)
self.layer.addSublayer(textLayer)
}
}
}
}