2016-08-22 13 views
4

Я знаю, что могу заполнить прямоугольник, используя NSRectFill (bounds). Однако я хотел сохранить прозрачность для вывода PDF, и я обнаружил, что могу это сделать только с NSBezierPath (rect: bounds) .fill() В чем разница (за кулисами) этих двух?В чем разница между NSRectFill и NSBezierPath (rect) .fill

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 делает то же самое, что и NSRectFill, в то время как NSRectFillUsingOperation + CompositeSourceOver ведет себя как NSBezierPath + fill. Постарайтесь написать это как ответ, и я даю вам кредит. Благодарю. –

+0

Спасибо, сделал это. Рад, что это сработало! – matt

ответ

3

Я в основном программист IOS и не очень свободно в эти дни над на стороне AppKit вещей, но я думаю, что вы получаете неправильный NSCompositingOperation. Я вижу из документов, что NSRectFill использует NSCompositeCopy. Возможно, это будет работать лучше, если вы использовали NSRectFillUsingOperation, где вы можете указать операцию компоновки.