2

drawRect を持つ NSView があります

- (void)drawRect:(CGRect)rect {
    // Drawing code
    NSPoint origin = [self visibleRect].origin;
    [[NSGraphicsContext currentContext]
     setPatternPhase:NSMakePoint(origin.x, origin.y)];
    [[NSColor colorWithPatternImage: self.image] set];
    [NSBezierPath fillRect: [self bounds]];
}

それは私のパターンを完全に描画しますが、ウィンドウのサイズを変更するとパターンがスクロールするのを見ることができます。

ビュー isFlipped を YES に設定しようとしましたが、何も変わりません。

4

2 に答える 2

1

最初に画面外の描画を行ってから、その結果をビューに描画する必要があります。たとえば、ビューとまったく同じサイズの空白のNSImageを使用し、その画像にパターンを描画してから、その画像をビューに描画できます。

コードは次のようになります。

- (void)drawRect:(NSRect)dirtyRect
{
  // call super
  [super drawRect:dirtyRect];

  // create blank image and lock drawing on it    
  NSImage* bigImage = [[[NSImage alloc] initWithSize:self.bounds.size] autorelease];
  [bigImage lockFocus];

  // draw your image patter on the new blank image
  NSColor* backgroundColor = [NSColor colorWithPatternImage:bgImage];
  [backgroundColor set];
  NSRectFill(self.bounds);

  [bigImage unlockFocus];

  // draw your new image    
  [bigImage drawInRect:self.bounds
            fromRect:NSZeroRect 
           operation:NSCompositeSourceOver 
            fraction:1.0f];
}

// I think you may also need to flip your view
- (BOOL)isFlipped
{
  return YES;
}
于 2012-09-10T07:01:23.760 に答える
0

迅速

残念なことに、Objective-C の遺産の一部が失われ、Cocoa に関して言えば、Swift は孤児のようです。とにかく、Neovibrant に基づいて、解決策を差し引くことができます。

  1. サブクラス NSView
  2. 描画メソッドをオーバーライドする
    • 親メソッドを呼び出す (これは重要です)
    • ビューの境界内でバッファに塗りつぶしを設定します
    • バッファーに塗りつぶしを描画する

コード

    override func draw(_ dirtyRect: NSRect) {
         super.draw(dirtyRect)

         let bgimage : NSImage = /* Set the image you want */
         let background = NSColor.init(patternImage: bgimage)
         background.setFill()

         bgimage.draw(in: self.bounds, from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
    }
于 2018-09-06T15:17:07.740 に答える