您好,我在 drawRect 上有一幅我很滿意的圖畫,我現在正在嘗試從特定路徑覆寫影像,我希望它作為覆寫圖位于當前圖畫之上。有誰知道最好的方法是什么,我希望能夠設定此影像的位置和大小。
這可以用核心圖形來完成還是我應該使用 NSImage 來做到這一點 - 很感激任何能指出我正確方向的人:)
uj5u.com熱心網友回復:
NSView drawRect:可以在 的子類實作之前或之后呼叫您的方法drawRect:,這使您可以決定是更早還是更晚執行額外的繪圖代碼,因此最終會在 的繪圖結果之上還是之下super。
// in subclass
- (void)drawRect:(CGRect)dirtyrect {
[super drawRect:dirtyrect]; //to draw super below
// ask for flip state first
CGFloat yFlip = self.flipped ? -1.0 : 1.0;
// your additional
// drawing code here..
// and do something with yFlip
// ...
//[super drawRect:dirtyrect]; //to draw super on top
}
由于flip在繪制時可能會尊重視圖或圖層的狀態,因此您必須在進行自己的繪制呼叫之前檢查翻轉狀態。要做到這一點,要求self.flipped或super.flipped適應如上所示的視圖翻轉狀態。
但是有很多不同的方法可以將翻轉的內容與非翻轉的內容混合在一起。
以下代碼self.flipped在NSImage通過使用lockFocusFlipped:方法而不是僅使用鎖定焦點來創建lockFocus. 還展示了其他API,ps:你不必實作imageRepresentation,以下包含或多或少的偽代碼
- (NSImage *)imageRepresentation
{
//BOOL wasHidden = self.isHidden;
//CGFloat wantedLayer = self.wantsLayer;
//self.hidden = NO;
//self.wantsLayer = YES;
NSImage *image = [[NSImage alloc] initWithSize:self.bounds.size];
// to flip an image according to the views flip state
//[image lockFocus];
[image lockFocusFlipped:self.flipped];
CGContextRef ctx = [NSGraphicsContext currentContext].CGContext;
// to flip with CoreGraphics API
//CGContextScaleCTM(ctx, 1.0, -1.0); // <-- see -1.0?
//CGContextTranslateCTM(ctx, 1.0, 1.0);
// or Affine Transform API, pseudo code
//NSAffineTransform *trans = [NSAffineTransform transform];
//[trans translateXBy:0 yBy:existingSize.height];
//[trans scaleXBy:1 yBy:-1];
//[trans concat];
//[image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, newSize.width, newSize.height) operation:NSCompositingOperationSourceOver fraction:1.0];
//[self.layer renderInContext:ctx]; // <-- CALayer backed view drawing
[self drawRect:self.bounds.size]; // <-- classic View drawing
[image unlockFocus];
//self.wantsLayer = wantedLayer;
//self.hidden = wasHidden;
return image;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358537.html
