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

312 lines
9.9 KiB
Swift
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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)
}
}