2017-09-27 11 views
0

背景画像にマスクとして機能する半円の線を描きたい。私は、このイメージがあります Backgound image を、私は、この取得したい:私は、カスタムのUIViewのdrawメソッド内で、次のコードを試してみました Mask を、私は唯一のストロークのパスではなく、マスクする方法がわかりません全体円弧。私は何が欠けていますか?UIBezierPathを使用して背景画像をマスクする

 let context = UIGraphicsGetCurrentContext()! 
context.saveGState() 

     context.setLineWidth(4) 

     path = UIBezierPath() 
     path.addArc(withCenter: CGPoint(x: self.bounds.midX, y: self.bounds.height), radius: self.bounds.height-10, startAngle: -180 * CGFloat.pi/180, endAngle: 0 * CGFloat.pi/180, clockwise: true) 

     context.addPath(path.cgPath) 
     context.replacePathWithStrokedPath() 
     context.clip() 

     let gradient = CGGradient(colorsSpace: nil, colors: [UIColor.clear.cgColor, UIColor.clear.cgColor] as CFArray, locations: nil)! 
     context.drawLinearGradient(gradient, start: CGPoint(x: 0, y: 0), end: CGPoint(x: 200, y: 0), options: []) 

     context.restoreGState() 

     context.saveGState() 

     let myLayer = CALayer() 
     let myImage = UIImage(named: "color")?.cgImage 
     myLayer.frame = self.bounds 
     myLayer.contents = myImage 

     let maskLayer = CAShapeLayer() 
     maskLayer.path = context.path 

     myLayer.mask = maskLayer 

     self.layer.addSublayer(myLayer) 

     context.restoreGState() 
+0

こんにちは、あなたは「どのようにのみストロークパスをマスクする」とはどういう意味ですか? –

+0

"context.setLineWidth(4)":代わりに、この情報の幅を持つパスを作成します。それはちょうど2つの円弧と2つの線です。 – Larme

+0

@Larmeそれは 'replacePathWithStrokedPath'が行うことですAFAIK – jrturton

答えて

0

その方法で起こってたくさんあります、のかなり多くはのdrawRectにすべきではない - それは、グラフィックスはCPUに作業シフトとして、それは、あなたができる場合のdrawRectを避けるのがベストです。

簡単にするために、コンテキストとパスを使用してイメージをマスクする方法を示しました。上記のコードの問題は、パスが非常に狭く、おそらくレインボーイメージの可視部分の外にあったためですあなたは何も見ていませんでしたか?

このようなコードを作成して遊び場に入れると、すぐに結果を確認したり、非常に簡単に行うことができます。パスを壊すことも、何も見えないときに期待しているかどうかを確認するのに便利です。

import UIKit 

let image = UIImage(named: "I6BbE.jpg")! 

let renderer = UIGraphicsImageRenderer(size: image.size) 
let maskedImage = renderer.image { 
    context in 
    let cgContext = context.cgContext 
    let bounds = context.format.bounds 
    cgContext.setLineWidth(50) 

    let path = UIBezierPath() 
    path.addArc(
     withCenter: CGPoint(x: bounds.midX, y: bounds.height), 
     radius: bounds.height-100, 
     startAngle: .pi, 
     endAngle: 0, 
     clockwise: true) 

    cgContext.addPath(path.cgPath) 
    cgContext.replacePathWithStrokedPath() 
    cgContext.clip() 
    image.draw(in: bounds) 
} 

maskedImage 

私与える:遊び場にあなたのオリジナルの虹を追加し、私はこれをしなかった

enter image description here

関連する問題