Так что я немного поиграл и нашел решение (также благодаря ссылке @iOSDev на статью).
Если кому-то понадобятся подобные вещи, вот оно:
@IBOutlet weak var alphaView: UIView!
@IBOutlet weak var pickedImage: UIImageView!
@IBOutlet weak var bigStackView: UIStackView!
override func viewWillAppear(_ animated: Bool) {
pickedImage.image = imagePicked
// Set white background color with custom alpha
alphaView.backgroundColor = UIColor(white: 255/255, alpha: 0.85)
// Create the initial layer from the stackView bounds.
let maskLayer = CAShapeLayer()
maskLayer.frame = alphaView.bounds
// Create the frame to cover whole stackView
let rect = CGRect(
x: bigStackView.frame.minX,
y: bigStackView.frame.minY,
width: bigStackView.bounds.width,
height: bigStackView.bounds.height)
// Create the path
let path = UIBezierPath(rect: alphaView.bounds)
maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
// Append the framer to the path so that it is subtracted
path.append(UIBezierPath(rect: rect))
maskLayer.path = path.cgPath
// Set the mask of the alphaview
alphaView.layer.mask = maskLayer
}
selectedImage - представление фонового изображения, которое покрыто aplhaView, используемым только для того, чтобы сделать его туманным, а bigStackView имеет 16 квадратов в середине, чтобы определить положение искомого квадрата. Можно также использовать явное значение CGPoint & CGSize.
Снимок экрана с симулятора