NSRect.fill() не работает с чистыми цветами на Xcode 9 Swift 4
Swift 4 имеет новую функцию NSRect.fill () для замены NSRectFill(). При попытке очистить растровое изображение с помощью NSColor.clear.setFill(), растровое изображение остается неизменным с помощью NSRect.fill ().
Обходной путь - использовать NSRect.fill (используя:) и указав.copy.
Вот что делает код в Playgrounds в 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().
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)
это синтаксис для сохранения идентичного поведения.