2024-02-29 23:49:12 +08:00
|
|
|
|
//
|
|
|
|
|
// UIView+.swift
|
|
|
|
|
// yinmeng-ios
|
|
|
|
|
//
|
2024-03-05 14:04:09 +08:00
|
|
|
|
// Created by yinmeng on 2024/2/29.
|
2024-02-29 23:49:12 +08:00
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
|
|
|
|
|
|
extension UIView {
|
|
|
|
|
/// x
|
|
|
|
|
public var x : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.origin.x
|
|
|
|
|
}
|
|
|
|
|
set (x) {
|
|
|
|
|
var frame = self.frame
|
|
|
|
|
frame.origin.x = x
|
|
|
|
|
self.frame = frame
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// y
|
|
|
|
|
public var y : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.origin.y
|
|
|
|
|
}
|
|
|
|
|
set (y) {
|
|
|
|
|
var frame = self.frame
|
|
|
|
|
frame.origin.y = y
|
|
|
|
|
self.frame = frame
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// maxX
|
|
|
|
|
public var maxX : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.maxX
|
|
|
|
|
}
|
|
|
|
|
set(maxX) {
|
|
|
|
|
self.frame.origin.x = maxX - self.frame.size.width
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// maxY
|
|
|
|
|
public var maxY : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.maxY
|
|
|
|
|
}
|
|
|
|
|
set(maxY) {
|
|
|
|
|
self.frame.origin.y = maxY - self.frame.size.height
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// width
|
|
|
|
|
public var width : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.size.width
|
|
|
|
|
}
|
|
|
|
|
set (width) {
|
|
|
|
|
var frame = self.frame
|
|
|
|
|
frame.size.width = width
|
|
|
|
|
self.frame = frame
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// height
|
|
|
|
|
public var height : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.size.height
|
|
|
|
|
}
|
|
|
|
|
set (height) {
|
|
|
|
|
var frame = self.frame
|
|
|
|
|
frame.size.height = height
|
|
|
|
|
self.frame = frame
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// centerX
|
|
|
|
|
public var centerX : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.center.x
|
|
|
|
|
}
|
|
|
|
|
set (centerX) {
|
|
|
|
|
var center = self.center
|
|
|
|
|
center.x = centerX
|
|
|
|
|
self.center = center
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// centerY
|
|
|
|
|
public var centerY : CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.center.y
|
|
|
|
|
}
|
|
|
|
|
set (centerY) {
|
|
|
|
|
var center = self.center
|
|
|
|
|
center.y = centerY
|
|
|
|
|
self.center = center
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// size
|
|
|
|
|
public var size : CGSize {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.size
|
|
|
|
|
}
|
|
|
|
|
set (size) {
|
|
|
|
|
var newSize = self.frame.size
|
|
|
|
|
newSize = CGSize(width: size.width, height: size.height)
|
|
|
|
|
self.frame.size = newSize
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// origin
|
|
|
|
|
public var origin : CGPoint {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.frame.origin
|
|
|
|
|
}
|
|
|
|
|
set (origin) {
|
|
|
|
|
var newOrigin = self.frame.origin
|
|
|
|
|
newOrigin = CGPoint(x: origin.x, y: origin.y)
|
|
|
|
|
self.frame.origin = newOrigin
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// borderWidth
|
|
|
|
|
public var borderWidth: CGFloat {
|
|
|
|
|
|
|
|
|
|
get {
|
|
|
|
|
return self.layer.borderWidth
|
|
|
|
|
}
|
|
|
|
|
set (borderWidth){
|
|
|
|
|
self.layer.borderWidth = borderWidth
|
|
|
|
|
|
|
|
|
|
guard self.layer.masksToBounds else {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
self.layer.masksToBounds = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-01 01:27:25 +08:00
|
|
|
|
extension UIView {
|
|
|
|
|
//添加4个不同大小的圆角
|
|
|
|
|
func addCorner(cornerRadii:CornerRadii, frame:CGRect){
|
|
|
|
|
let path = createPathWithRoundedRect(bounds: frame, cornerRadii:cornerRadii)
|
|
|
|
|
let shapLayer = CAShapeLayer()
|
|
|
|
|
shapLayer.frame = self.bounds
|
|
|
|
|
shapLayer.path = path
|
|
|
|
|
self.layer.mask = shapLayer
|
|
|
|
|
}
|
|
|
|
|
//各圆角大小
|
|
|
|
|
struct CornerRadii {
|
|
|
|
|
var topLeft :CGFloat = 0
|
|
|
|
|
var topRight :CGFloat = 0
|
|
|
|
|
var bottomLeft :CGFloat = 0
|
|
|
|
|
var bottomRight :CGFloat = 0
|
|
|
|
|
}
|
|
|
|
|
//切圆角函数绘制线条
|
|
|
|
|
func createPathWithRoundedRect( bounds:CGRect,cornerRadii:CornerRadii) -> CGPath
|
|
|
|
|
{
|
|
|
|
|
let minX = bounds.minX
|
|
|
|
|
let minY = bounds.minY
|
|
|
|
|
let maxX = bounds.maxX
|
|
|
|
|
let maxY = bounds.maxY
|
|
|
|
|
|
|
|
|
|
//获取四个圆心
|
|
|
|
|
let topLeftCenterX = minX + cornerRadii.topLeft
|
|
|
|
|
let topLeftCenterY = minY + cornerRadii.topLeft
|
|
|
|
|
|
|
|
|
|
let topRightCenterX = maxX - cornerRadii.topRight
|
|
|
|
|
let topRightCenterY = minY + cornerRadii.topRight
|
|
|
|
|
|
|
|
|
|
let bottomLeftCenterX = minX + cornerRadii.bottomLeft
|
|
|
|
|
let bottomLeftCenterY = maxY - cornerRadii.bottomLeft
|
|
|
|
|
|
|
|
|
|
let bottomRightCenterX = maxX - cornerRadii.bottomRight
|
|
|
|
|
let bottomRightCenterY = maxY - cornerRadii.bottomRight
|
|
|
|
|
|
|
|
|
|
//虽然顺时针参数是YES,在iOS中的UIView中,这里实际是逆时针
|
|
|
|
|
let path :CGMutablePath = CGMutablePath();
|
|
|
|
|
//顶 左
|
|
|
|
|
path.addArc(center: CGPoint(x: topLeftCenterX, y: topLeftCenterY), radius: cornerRadii.topLeft, startAngle: CGFloat.pi, endAngle: CGFloat.pi * 3 / 2, clockwise: false)
|
|
|
|
|
//顶右
|
|
|
|
|
path.addArc(center: CGPoint(x: topRightCenterX, y: topRightCenterY), radius: cornerRadii.topRight, startAngle: CGFloat.pi * 3 / 2, endAngle: 0, clockwise: false)
|
|
|
|
|
//底右
|
|
|
|
|
path.addArc(center: CGPoint(x: bottomRightCenterX, y: bottomRightCenterY), radius: cornerRadii.bottomRight, startAngle: 0, endAngle: CGFloat.pi / 2, clockwise: false)
|
|
|
|
|
//底左
|
|
|
|
|
path.addArc(center: CGPoint(x: bottomLeftCenterX, y: bottomLeftCenterY), radius: cornerRadii.bottomLeft, startAngle: CGFloat.pi / 2, endAngle: CGFloat.pi, clockwise: false)
|
|
|
|
|
path.closeSubpath();
|
|
|
|
|
return path;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|