2

我是新手,我什至很难正确地提出我的问题,因为我不知道正确的术语。我已经完成了一些客观的 c 编码,所以除了使用 UI 之外,我有点超出初学者的水平。

我想知道实现这一目标的最佳实践——即正确的方法。

我有一个窗口,顶部有一些按钮。下面是一个区域,将有一个image 或 webview。这将是可变大小的,所以为了让它看起来不错,我希望它后面的区域有一个漂亮的平铺图案。

我已经尝试了一些可行的方法,但一切都感觉有点骇人听闻。是否有一个控件可以自动提供平铺背景并让我将其他控件放入其中?就此而言,是否有任何类型的控件可以将其他控件放入其中?(我在 GTK 中已经习惯了,但在 Cocoa 中似乎并不常见)

另外,考虑到图像可以根据上面的按钮改变大小,我应该使用核心动画和它的图层(我已经阅读过它们但没有使用它们)?

在此处输入图像描述

4

2 回答 2

1

一种相当简单的方法是使用自定义 NSView 子类作为背景视图。在它的 -drawRect: 方法中,编写代码来获取图像并重复绘制它以填充视图的边界。执行此操作的算法非常简单。从左上角(或任何角落)开始,绘制图像,然后将 x 位置增加图像的宽度,然后再次绘制。当 x 位置超过视图的最大 x 坐标时,将 y 增加图像的高度并绘制下一行,依此类推,直到你填满整个东西。这应该可以解决问题:

@interface TiledBackgroundView : NSView
@end

@implementation TiledBackgroundView

- (void)drawRect:(NSRect)dirtyRect
{
    NSRect bounds = [self bounds];
    NSImage *image = ...
    NSSize imageSize = [image size];

    //  start at max Y (top) so that resizing the window looks to be anchored at the top left 
    for ( float y = NSHeight(bounds) - imageSize.height; y >= -imageSize.height; y -= imageSize.height ) {
        for ( float x = NSMinX(bounds); x < NSWidth(bounds); x += imageSize.width ) {
            NSRect tileRect = NSMakeRect(x, y, imageSize.width, imageSize.height);
            if ( NSIntersectsRect(tileRect, dirtyRect) ) {
                NSRect destRect = NSIntersectionRect(tileRect, dirtyRect);
                [image drawInRect:destRect
                         fromRect:NSOffsetRect(destRect, -x, -y)
                        operation:NSCompositeSourceOver 
                         fraction:1.0];
            }
        }
    }
}

@end
于 2012-09-20T22:42:58.213 回答
0

没有控件会自动为您平铺背景。

请记住,NSViews(通常是子类)完成所有绘图 - 例如,灰色区域将是的子类,NSView您可以将图像放入其中。

要实际绘制平铺图像(通过NSView子类),可以使用 Madsen 的方法,但不是最方便的。最简单的方法是:

NSColor *patternColor = [NSColor colorWithPatternImage:[NSImage imageNamed:@"imageName"]];
[patternColor setFill];
NSRectFill(rectToDraw);

您应该将其放入-drawRect:自定义视图类的方法中。它创建一个NSColor代表平铺图像的图像。请注意,它也可以是滚动/剪辑视图等的子类。

我对 Core Animation 不太熟悉,但它对于操作视图很有用,并且可能是您想要查看的关于绘制图像的视图(并且仅限该视图)的方向。

于 2012-09-21T03:20:48.480 回答