2016-08-22 7 views
4

私はNSRectFill(bounds)を使ってrectを書き込むことができます。しかし、私はPDF出力の透明性を保ちたいと思っていました。私はNSBezierPath(rect:bounds).fill()でしかできないことを発見しました。 その2つの違いは何ですか?NSRectFillとNSBezierPath(rect)の違いは何ですか?

func drawBackground() { 
    CGContextSaveGState(currentContext) 
    if (NSGraphicsContext.currentContextDrawingToScreen()) { 
     NSColor(patternImage: checkerboardImage).set() 
     NSRectFillUsingOperation(bounds, NSCompositingOperation.CompositeSourceOver) 
    } 
    NSColor.clearColor().setFill() 
    //NSRectFill(bounds) //option 1 
    NSBezierPath(rect: bounds).fill() // option 2 
    CGContextRestoreGState(currentContext) 
} 

extension NSImage { 

    static func checkerboardImageWithSize(size : CGFloat) -> NSImage { 
     let fullRect = NSRect(x: 0, y: 0, width: size, height: size) 
     let halfSize : CGFloat = size * 0.5; 
     let upperSquareRect = NSRect(x: 0, y: 0, width: halfSize, height: halfSize); 
     let bottomSquareRect = NSRect(x: halfSize, y: halfSize, width:halfSize, height: halfSize); 
     let image = NSImage(size: NSSize(width: size, height: size)) 
     image.lockFocus() 
     NSColor.whiteColor() 
     NSRectFill(fullRect) 
     NSColor(deviceWhite: 0.0, alpha:0.1).set() 
     NSRectFill(upperSquareRect) 
     NSRectFill(bottomSquareRect) 
     image.unlockFocus() 
     return image 
    } 
} 
+0

合成モードがNSCompositeCopyなのではありませんか? NSRectFillUsingOperationはうまくいったでしょうか? – matt

+0

はい、あなたは完全に正しいです。 NSRectFillUsingOperation + CompositeCopyは、NSRectFillUsingOperation + CompositeSourceOverがNSBezierPath + fillのように動作する間、NSRectFillと同じことを行います。答えとして書くようにしてください。私はあなたに信用を与えます。ありがとう。 –

+0

ありがとう、そうでした。これがうまくいってうれしい! – matt

答えて

3

私は物事のAppKitの側で、これらの日、ほとんどのiOSプログラマではなく非常に流暢超えるんだけど、私の推測では、あなたが間違ったNSCompositingOperationを取得しているということです。私はNSRectFillがNSCompositeCopyを使用していることを文書から見ています。おそらく、合成操作を指定するNSRectFillUsingOperationを使用した方がうまくいくでしょう。

関連する問題