CIFilter
을 CALayer
에 적용하려면 사각형 조합을 제외한 영역을 사용해야합니다. 작동하지 않는 코드를 게시합니다. 정확히 반대입니다. 즉, 필터는 사각형이 아닌 외부에만 적용됩니다. CALayer에서 필터링 (사각형 일 필요는 없습니다) 사각형을 제외한 모양
func refreshTheFrameWithEffect() {
self.layer!.masksToBounds = true
self.layerUsesCoreImageFilters = true
self.layer!.needsDisplayOnBoundsChange = true
let filter = CIFilter(name: "CICircleSplashDistortion")
filter!.setDefaults()
self.layer!.backgroundFilters = [filter!]
var excludedRects: [CGRect] = [] //INITIALISE THEM HOW YOU PREFER
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
self.layer!.fillMode = kCAFillRuleEvenOdd
var maskPath = NSBezierPath()
for rect in excludedRects {
maskPath.append(NSBezierPath(rect: rect))
}
maskLayer.path = maskPath.CGPath
self.layer!.mask = maskLayer
self.layer!.needsDisplay()
}
다음 NSBezierPath 이후 인터넷에서 다음 코드 UIBezierPath 달리 속성 CGPath을 가지고 있지 않습니다
.public var CGPath: CGPath {
let path = CGMutablePath()
var points = [CGPoint](repeating: .zero, count: 3)
for i in 0 ..< self.elementCount {
let type = self.element(at: i, associatedPoints: &points)
switch type {
case .moveToBezierPathElement: path.move(to: CGPoint(x: points[0].x, y: points[0].y))
case .lineToBezierPathElement: path.addLine(to: CGPoint(x: points[0].x, y: points[0].y))
case .curveToBezierPathElement: path.addCurve( to: CGPoint(x: points[2].x, y: points[2].y),
control1: CGPoint(x: points[0].x, y: points[0].y),
control2: CGPoint(x: points[1].x, y: points[1].y))
case .closePathBezierPathElement: path.closeSubpath()
}
}
return path
}
필터에서 제외하려는 배경 뷰는 CGImage에서 가져옵니다. 그래서 저는 제외시키고 자하는 모든 직사각형에 대해 CGImage를 잘라내어 코드가 필터와 관련된 뷰 위의 뷰에 배치되도록 코드를 관리했습니다.더 정확하게 각 사각형에 대해 CGImage 자르기, NSImage 만들기, CALayer 만들기 및 NSImage와 같은 레이어 내용 설정, 레이어의 프레임을 NSImage 크기와 같게 설정하고 추가합니다 뷰의 레이어의 서브 레이어로서의 레이어. 모든 작업은 코드가 너무 느립니다. 빨리 코드를 작성할 수 있습니까? – Nisba
@LucaMarconato - 글쎄, 이미지를 마스크하고 싶다면'let maskImage = CGImage (maskWidth : ...)'와'someCgImage.masking (maskImage)'를 사용할 수있다. 첨부 된 코드 스 니펫을 참조하십시오. 그러나 그것은 CGImage를 마스킹하기위한 것이지 마스킹 레이어가 아닙니다. 위의 예를 참조하십시오. 하지만 짝수/홀수 풀기/채우기 규칙을 사용하여 겹치는 경로와 관련된 기이함을 해결합니다. – Rob