// MARK: Round public extension UIView { public func round(byRoundingCorners: UIRectCorner = UIRectCorner.allCorners, cornerRadi: CGFloat) { self.round(byRoundingCorners: byRoundingCorners, cornerRadii: CGSize(width: cornerRadi, height: cornerRadi)) } public func round(byRoundingCorners: UIRectCorner = UIRectCorner.allCorners, cornerRadii: CGSize) { guard let maskLayer = self.layer.mask else { let rect = self.bounds let bezierPath = UIBezierPath(roundedRect: rect, byRoundingCorners: byRoundingCorners, cornerRadii: cornerRadii) defer { bezierPath.close() } let shapeLayer = CAShapeLayer() shapeLayer.path = bezierPath.cgPath self.layer.mask = shapeLayer self.layer.masksToBounds = true return } } } // MARK: UIView 快照 public extension UIView { public var snapshotImage: UIImage? { return snapshot() } public func snapshot(rect: CGRect = CGRect.zero, scale: CGFloat = UIScreen.main.scale) -> UIImage? { var snapRect = rect if __CGSizeEqualToSize(rect.size, CGSize.zero) { snapRect = calculateSnapshotRect() } UIGraphicsBeginImageContextWithOptions(snapRect.size, false, scale) defer { UIGraphicsEndImageContext() } self.drawHierarchy(in: snapRect, afterScreenUpdates: false) return UIGraphicsGetImageFromCurrentImageContext() } // 計算UIView所顯示內容Rect func calculateSnapshotRect() -> CGRect { var targetRect = self.bounds if let scrollView = self as? UIScrollView { let contentInset = scrollView.contentInset let contentSize = scrollView.contentSize targetRect.origin.x = contentInset.left targetRect.origin.y = contentInset.top targetRect.size.width = targetRect.size.width - contentInset.left - contentInset.right > contentSize.width ? targetRect.size.width - contentInset.left - contentInset.right : contentSize.width targetRect.size.height = targetRect.size.height - contentInset.top - contentInset.bottom > contentSize.height ? targetRect.size.height - contentInset.top - contentInset.bottom : contentSize.height } return targetRect } }