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 回答