NSRect.fill() не работает с чистыми цветами на Xcode 9 Swift 4

Swift 4 имеет новую функцию NSRect.fill () для замены NSRectFill(). При попытке очистить растровое изображение с помощью NSColor.clear.setFill(), растровое изображение остается неизменным с помощью NSRect.fill ().

Обходной путь - использовать NSRect.fill (используя:) и указав.copy.

Вот что делает код в Playgrounds в Swift 4: Swift 4

Образец кода:

// Duplicating a bug with Xcode 9 and Swift 4

import Cocoa

var image = NSImage(size: NSSize(width: 32, height: 32))
let rect = NSRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
image.lockFocus()
NSColor.red.setFill()
rect.fill()
image.unlockFocus()
image.lockFocus()
NSColor.clear.setFill()
// calling fill() with a clear color does not work
rect.fill()
image.unlockFocus()
// Image above should not be red
image.lockFocus()
NSColor.clear.setFill()
// using fill(using:) does work
rect.fill(using: .copy)
image.unlockFocus()
// image above is properly cleared

Это ошибка, которую я должен отправить в Apple, или я что-то упустил? Эта последовательность работала в Swift 3 с использованием NSRectFill().

Вот Swift 3 с использованием NSRectFill: Свифт 3

1 ответ

У них просто другая логика по умолчанию:
Старый синтаксис всегда был .copy.
Новый синтаксис — это контекст, если он присутствует, или .sourceOver.

       void NSRectFill(NSRect rect);

Заполняет aRect текущим цветом, используя режим композитинга NSCompositingOperationCopy.

(источник: https://developer.apple.com/documentation/appkit/1473652-nsrectfill)

       /// Fills this rect in the current NSGraphicsContext in the context's fill
/// color.
/// The compositing operation of the fill defaults to the context's
/// compositing operation, not necessarily using `.copy` like `NSRectFill()`.
/// - precondition: There must be a set current NSGraphicsContext.
@available(swift 4)
public func fill(using operation: NSCompositingOperation = NSGraphicsContext.current?.compositingOperation ?? .sourceOver)

(источник: комментарии Xcode для https://developer.apple.com/documentation/corefoundation/cgrect/2903486-fill/)

Итак, если вы конвертируете старый код в новый формат, тоrect.fill(using: .copy)это синтаксис для сохранения идентичного поведения.

Другие вопросы по тегам