Visual_Novel_iOS/crush/Crush/Src/Utils/Extensions/UIViewExt.swift

312 lines
9.9 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// UIView+Ext.swift
// DouYinSwift5
//
// Created by lym on 2020/7/23.
// Copyright © 2020 lym. All rights reserved.
//
import UIKit
public func adaptWidth(designWidth: CGFloat = 375.0, _ vale: CGFloat) -> CGFloat {
return UIScreen.main.bounds.size.width / designWidth * vale
}
// MARK: -
@objc extension UIView {
///
@IBInspectable var borderColor: UIColor? {
get {
guard let color = layer.borderColor else { return nil }
return UIColor(cgColor: color)
}
set {
guard let color = newValue else {
layer.borderColor = nil
return
}
layer.borderColor = color.cgColor
}
}
///
@IBInspectable var borderWidth: CGFloat {
get { return layer.borderWidth }
set { layer.borderWidth = newValue }
}
///
@IBInspectable var cornerRadius: CGFloat {
get { return layer.cornerRadius }
set {
layer.cornerRadius = newValue
layer.masksToBounds = true
}
}
var size: CGSize {
get { return frame.size }
set { width = newValue.width; height = newValue.height }
}
var width: CGFloat {
get { return frame.size.width }
set { return frame.size.width = newValue }
}
var height: CGFloat {
get { return frame.size.height }
set { return frame.size.height = newValue }
}
var x: CGFloat {
get { return frame.origin.x }
set { frame.origin.x = newValue }
}
var y: CGFloat {
get { return frame.origin.y }
set { frame.origin.y = newValue }
}
var centerX: CGFloat {
get { return center.x }
set { center.x = newValue }
}
var centerY: CGFloat {
get { return center.y }
set { center.y = newValue }
}
var origin: CGPoint {
get { return frame.origin }
set { frame.origin = newValue }
}
}
@objc public extension UIView {
///
func removeSubviews() {
subviews.forEach { $0.removeFromSuperview() }
}
///
/// - Parameters:
/// - color:
/// - radius:
/// - offset:
/// - opacity:
func addShadow(ofColor color: UIColor = UIColor(red: 0.07, green: 0.47, blue: 0.57, alpha: 1.0),
radius: CGFloat = 3,
offset: CGSize = .zero,
opacity: Float = 0.5)
{
layer.shadowColor = color.cgColor
layer.shadowOffset = offset
layer.shadowRadius = radius
layer.shadowOpacity = opacity
layer.masksToBounds = false
}
///
///
/// - Returns:
func viewController() -> UIViewController? {
var view: UIView? = self
repeat {
if let nextResponder = view?.next {
if nextResponder.isKind(of: UIViewController.self) {
return nextResponder as? UIViewController
}
}
view = view?.superview
} while view != nil
return nil
}
}
@objc extension UIView {
@discardableResult
///
func addGradientColor(startPoint: CGPoint,
endPoint: CGPoint,
locs: [NSNumber] = [0, 1],
colors: [Any],
cornerRadius: CGFloat = 0) -> CAGradientLayer?
{
guard startPoint.x >= 0,
startPoint.x <= 1,
startPoint.y >= 0,
startPoint.y <= 1,
endPoint.x >= 0,
endPoint.x <= 1,
endPoint.y >= 0,
endPoint.y <= 1
else {
return nil
}
layoutIfNeeded()
var gradientLayer: CAGradientLayer!
removeGradientLayer()
gradientLayer = CAGradientLayer()
gradientLayer.frame = layer.bounds
gradientLayer.startPoint = startPoint
gradientLayer.endPoint = endPoint
gradientLayer.colors = colors
gradientLayer.cornerRadius = layer.cornerRadius
gradientLayer.masksToBounds = true
gradientLayer.locations = locs
if cornerRadius > 0 {
let shapeLayer = CAShapeLayer()
shapeLayer.borderWidth = 1
shapeLayer.path = UIBezierPath(roundedRect: gradientLayer.bounds, cornerRadius: cornerRadius).cgPath
shapeLayer.fillColor = UIColor.clear.cgColor // clearColornil
shapeLayer.strokeColor = UIColor.white.cgColor // 便clearColor
gradientLayer.mask = shapeLayer
}
// uibutton
layer.insertSublayer(gradientLayer, at: 0)
backgroundColor = UIColor.clear
// selfUILabelmasksToBoundstrue
// layer.masksToBounds = false
return gradientLayer
}
public func removeGradientLayer() {
if let sl = layer.sublayers {
for layer in sl {
if layer.isKind(of: CAGradientLayer.self) {
layer.removeFromSuperlayer()
}
}
}
}
func addDashedBorder(to view: UIView, lineLength: CGFloat = 8, lineSpacing: CGFloat = 2, cornerRadius: CGFloat = 0) {
let shapeLayer = CAShapeLayer()
shapeLayer.name = "DashedBorder"
let lineColor = UIColor.c.con
// let lineColor = UIColor.red
shapeLayer.bounds = view.bounds
shapeLayer.position = CGPoint(x: view.bounds.width / 2, y: view.bounds.height / 2)
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = lineColor.cgColor
shapeLayer.lineWidth = 1
shapeLayer.lineJoin = .round
shapeLayer.lineDashPattern = [NSNumber(value: Float(lineLength)), NSNumber(value: Float(lineSpacing))]
let path = UIBezierPath(roundedRect: view.bounds, cornerRadius: cornerRadius)
shapeLayer.path = path.cgPath
// 线
view.layer.sublayers?.removeAll(where: { $0.name == "DashedBorder" })
view.layer.addSublayer(shapeLayer)
}
}
extension UIView{
///
///
/// 使
/// ```
/// CGRect rect = [self.view convertRect:_button.frame fromViewOrWindow:_button.superview];
/// ```
///
/// buttonframesuperviewframebuttonsuperview
///
/// toViewframesuperviewfromViewview.
///
/// - Parameters:
/// - rect:
/// - view:
/// - Returns:
func convertRect(rect: CGRect, fromViewOrWindow view: UIView?) -> CGRect {
guard let view = view else {
if isKind(of: UIWindow.self) {
return (self as! UIWindow).convert(rect, from: nil)
} else {
return convert(rect, from: nil)
}
}
if let from = view.isKind(of: UIWindow.self) ? (view as! UIWindow) : view.window,
let to = isKind(of: UIWindow.self) ? (self as! UIWindow) : window, from != to {
var r = rect
r = from.convert(r, from: view)
r = to.convert(r, from: from)
r = convert(r, from: to)
return r
} else {
return convert(rect, from: view)
}
}
}
extension UIView{
/// UIView
///
/// - Parameters:
/// - isVertical:
/// - times: 5
/// - interval: 0.1
/// - delta: 2
/// - completion:
public func shake(_ isVertical: Bool = false,
_ times: Int = 5,
_ interval: TimeInterval = 0.1,
_ delta: CGFloat = 2,
_ completion: (() -> ())? = nil) {
//
UIView.animate(withDuration: interval) {
var transform = CGAffineTransform(translationX: 0, y: delta)
if isVertical == true {
transform = CGAffineTransform(translationX: delta, y: 0)
}
self.layer.setAffineTransform(transform)
} completion: {_ in
//
if (times == 0) {
UIView.animate(withDuration: interval) {
self.layer.setAffineTransform(CGAffineTransform.identity)
} completion: { _ in
completion?()
}
}else {
// 1
self.shake(isVertical, times - 1, interval, -delta, completion)
}
}
}
}
extension UIView {
//UIImage
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
///
var screenRect: CGRect? {
guard let window = self.window else { return nil }
return self.superview?.convert(self.frame, to: window)
}
}