У меня есть UIView
с прозрачным maskLayer
определенного радиуса в определенной точке.Кроме того, у меня есть UIImageView
с UIPanGesture
& UIPinchGesture
.
Теперь я могу перетаскивать или увеличивать UIImageView
, чтобы он мог вписаться в часть маски UIView
.Как только это будет сделано, мне нужно получить UIImage
от UIImageView
относительно прозрачной части.
Я не знаю, как этого добиться.
Ниже приведен код, который создает наложение на UIView
с указанной маской CGRect
& radius.
func createOverlay(frame: CGRect,
xOffset: CGFloat,
yOffset: CGFloat,
radius: CGFloat) -> UIView {
// Step 1
let overlayView = UIView(frame: frame)
overlayView.backgroundColor = UIColor.groupTableViewBackground.withAlphaComponent(0.8)
// Step 2
let path = CGMutablePath()
beizerPath = UIBezierPath(arcCenter: CGPoint(x: xOffset, y: yOffset + radius), radius: radius, startAngle: 0.0, endAngle: 2.0 * .pi, clockwise: false)
path.addArc(center: CGPoint(x: xOffset, y: yOffset),
radius: radius,
startAngle: 0.0,
endAngle: 2.0 * .pi,
clockwise: false)
path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))
// Step 3
let maskLayer = CAShapeLayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.path = path
maskLayer.fillRule = .evenOdd
// Step 4
overlayView.layer.mask = maskLayer
overlayView.clipsToBounds = true
return overlayView
}
Здесь я сохраняю UIBezierPath
в случае любогонеобходимость!
Затем я попытался обрезать UIBezierPath
на UIImage
, но тогда это проблема с прямоугольником.Потому что UIImageView
можно перетаскивать и увеличивать, так что CGRect
изменяется.Ниже приведен код, который я использовал для создания отсечения.
extension UIImage {
func imageByApplyingClippingBezierPath(_ path: UIBezierPath) -> UIImage {
// Mask image using path
let maskedImage = imageByApplyingMaskingBezierPath(path)
// Crop image to frame of path
let croppedImage = UIImage(cgImage: maskedImage.cgImage!.cropping(to: path.bounds)!)
return croppedImage
}
func imageByApplyingMaskingBezierPath(_ path: UIBezierPath) -> UIImage {
// Define graphic context (canvas) to paint on
UIGraphicsBeginImageContext(size)
let context = UIGraphicsGetCurrentContext()!
context.saveGState()
// Set the clipping mask
path.addClip()
draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
let maskedImage = UIGraphicsGetImageFromCurrentImageContext()!
// Restore previous drawing context
context.restoreGState()
UIGraphicsEndImageContext()
return maskedImage
}
}
Другое решение, я думаю сделать снимок полного представления, а затем вырезать из него CGRect
.Но я не думаю, что это правильный способ!