jsdw_ios/QuickLocation/Core/Extension/UIView+Extension.swift

348 lines
11 KiB
Swift
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+extension.swift
// Pubquiz
//
// Created by crow on 2018/6/4.
// Copyright © 2018 xhy. All rights reserved.
//
import Foundation
import UIKit
public extension UIView {
///
/// - Parameters:
/// - radius:
/// - color: clear
/// - borderWidth: 线0.5
func setCornerRadius(_ radius: CGFloat,
color: UIColor = .clear,
borderWidth: CGFloat = 0.5) {
layer.masksToBounds = true
layer.cornerRadius = radius
layer.borderColor = color.cgColor
layer.borderWidth = borderWidth
}
/// UIViewframe
/// - Parameters:
/// - corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]
/// - size:
func setCornerRadius(_ rect: CGRect = .zero,
corners: UIRectCorner,
withCornerRadii size: CGSize) {
//
let roundedRect = rect == .zero ? bounds : rect
let maskPath = UIBezierPath(roundedRect: roundedRect,
byRoundingCorners: corners,
cornerRadii: size)
//
let maskLayer = CAShapeLayer()
maskLayer.frame = roundedRect
maskLayer.path = maskPath.cgPath
layer.mask = maskLayer
}
///
func setShadow(offset: CGSize, opacity: Float, radius: CGFloat, color: UIColor) {
self.layer.shadowColor = color.cgColor
self.layer.shadowOpacity = opacity
self.layer.shadowRadius = radius
self.layer.shadowOffset = offset
}
///
func addCommonShadow() {
setShadow(offset: .zero,
opacity: 0.1,
radius: 3,
color: UIColor.black.withAlphaComponent(0.2))
}
///
/// - Parameters:
/// - superView:
/// - insets: UIEdgeInsets
@objc
func addAndConstraintTo(superView: UIView,
insets: UIEdgeInsets = .zero) {
self.translatesAutoresizingMaskIntoConstraints = false
superView.addSubview(self)
self.leadingAnchor.constraint(equalTo: superView.leadingAnchor, constant: insets.left).isActive = true
self.topAnchor.constraint(equalTo: superView.topAnchor, constant: insets.top).isActive = true
self.trailingAnchor.constraint(equalTo: superView.trailingAnchor, constant: insets.right).isActive = true
self.bottomAnchor.constraint(equalTo: superView.bottomAnchor, constant: insets.bottom).isActive = true
superView.layoutIfNeeded()
}
static func removeExtraLineForTable(_ tableView: UITableView) {
let view = UIView()
tableView.tableFooterView = view
}
///
/// - Parameters:
/// - frame: frame
/// - startPoint:
/// - endPoint:
/// - colors:
/// - locations:
func setGradientLayer(frame: CGRect,
startPoint: CGPoint,
endPoint: CGPoint,
colors: [UIColor],
locations: [CGFloat]) {
if let sublayers = self.layer.sublayers {
for layer in sublayers {
if layer.name == "Defalut_GradientLayer" {
layer.removeFromSuperlayer()
break
}
}
}
let gradientLayer = CAGradientLayer()
gradientLayer.name = "Defalut_GradientLayer"
gradientLayer.frame = frame
gradientLayer.startPoint = startPoint
gradientLayer.endPoint = endPoint
gradientLayer.colors = colors.compactMap { $0.cgColor }
gradientLayer.locations = locations.compactMap { NSNumber(value: $0) }
// layer.addSublayer(gradientLayer)
if let firstSublayer = layer.sublayers?.first {
layer.insertSublayer(gradientLayer, below: firstSublayer)
} else {
layer.addSublayer(gradientLayer)
}
}
}
public extension UIView {
///
/// - Parameters:
/// - duration:
/// - usingSpringWithDamping: TimeInterval
/// - initialSpringVelocity: CGFloat
func affineTransformScale(duration: TimeInterval,
usingSpringWithDamping: TimeInterval,
initialSpringVelocity: CGFloat) {
self.layer.setAffineTransform(CGAffineTransform(scaleX: 0.1, y: 0.1))
UIView.animate(withDuration: duration, delay: 0.01, usingSpringWithDamping: usingSpringWithDamping, initialSpringVelocity: initialSpringVelocity, options:UIView.AnimationOptions.overrideInheritedOptions, animations: { () -> Void in
self.layer.setAffineTransform(CGAffineTransform(scaleX: 1, y: 1))
}) { finished in
UIView.animate(withDuration: 0.08, animations:{ ()-> Void in
self.layer.setAffineTransform(.identity)
})
}
}
}
// MARK: - IBDesignable
@IBDesignable extension UIView {
@IBInspectable public var borderColor:UIColor? {
set {
layer.borderColor = newValue!.cgColor
}
get {
if let color = layer.borderColor {
return UIColor(cgColor:color)
}
else {
return nil
}
}
}
@IBInspectable public var borderWidth:CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable public var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
@IBInspectable public var shadowOffset: CGSize {
set {
layer.shadowOffset = newValue
}
get {
return layer.shadowOffset
}
}
@IBInspectable public var shadowOpacity: Float {
set {
layer.shadowOpacity = newValue
}
get {
return layer.shadowOpacity
}
}
@IBInspectable public var shadowRadius: CGFloat {
set {
layer.shadowRadius = newValue
}
get {
return layer.shadowRadius
}
}
@IBInspectable public var shadowColor: UIColor? {
set {
layer.shadowColor = newValue?.cgColor
}
get {
if let color = layer.shadowColor {
return UIColor(cgColor:color)
}
else {
return nil
}
}
}
}
// MARK: - Frame
public extension DLWrapper where Base: UIView {
var height: CGFloat {
set {
var newframe = base.frame
newframe.size.height = newValue
base.frame = newframe
}
get { base.frame.size.height }
}
var width: CGFloat {
set {
var newframe = base.frame
newframe.size.width = newValue
base.frame = newframe
}
get { base.frame.size.width }
}
var x: CGFloat {
set {
var newframe = base.frame
newframe.origin.x = newValue
base.frame = newframe
}
get { base.frame.origin.x }
}
var y: CGFloat {
set {
var newframe = base.frame
newframe.origin.y = newValue
base.frame = newframe
}
get { base.frame.origin.y }
}
var size: CGSize {
set {
var newframe = base.frame
newframe.size = newValue
base.frame = newframe
}
get { base.frame.size }
}
var origin: CGPoint {
set {
var newframe = base.frame
newframe.origin = newValue
base.frame = newframe
}
get { base.frame.origin }
}
}
extension UIView {
func findSubView(with tag: Int) -> UIView? {
subviews.first(where: { $0.tag == tag })
}
}
// MARK: -
extension UIView {
func generateQRCodeImage(_ content: String, size: CGSize) -> UIImage? {
//
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {return nil}
//
filter.setDefaults()
//
let contentData = content.data(using: String.Encoding.utf8)
filter.setValue(contentData, forKey: "inputMessage")
//
guard let ciImage = filter.outputImage else { return nil }
let context = CIContext(options: nil)
let bitmapImage = context.createCGImage(ciImage, from: ciImage.extent)
let colorSpace = CGColorSpaceCreateDeviceGray()
let bitmapContext = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.none.rawValue)
//draw image
let scale = min(size.width / ciImage.extent.width, size.height / ciImage.extent.height)
bitmapContext!.interpolationQuality = CGInterpolationQuality.none
bitmapContext?.scaleBy(x: scale, y: scale)
bitmapContext?.draw(bitmapImage!, in: ciImage.extent)
//bitmap
guard let scaledImage = bitmapContext?.makeImage() else { return nil }
return UIImage(cgImage: scaledImage)
}
}
// MARK: -
extension UIView {
func takeScreenshot() -> UIImage? {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { context in
layer.render(in: context.cgContext)
}
}
}
extension UIView {
func stringPrefix(index: Int, text: String) -> String {
if text.count <= index {
return text
} else {
let index = text.index(text.startIndex, offsetBy: index)
let str = text.prefix(upTo: index)
return String(str)
}
}
}
// MARK: -
extension UIView {
func getDateInterval2String(date: String) -> String {
let date = Date(timeIntervalSince1970: TimeInterval(date.double))
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy.MM.dd HH:mm:ss"
let dateString = dateFormatter.string(from: date)
return dateString
}
}