gpt4 book ai didi

objective-c - 如何为窗口 cocoa 的一部分提供平铺图像

转载 作者:行者123 更新时间:2023-12-03 16:42:49 24 4
gpt4 key购买 nike

我对此很陌生,我什至很难正确地提出我的问题,因为我不知道正确的术语。我已经完成了一些 Objective-C 编码,因此除了使用 UI 之外,我还处于初学者的水平。

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

我有一个窗口,顶部有一些按钮。下面是一个将有图像或 WebView 的区域。这将是可变大小的,因此为了使它看起来漂亮,我希望它后面的区域有一个漂亮的平铺图案。

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

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

enter image description here

最佳答案

一种相当简单的方法是使用自定义 NSView 子类作为背景 View 。在其 -drawRect: 方法中,编写代码来获取图像并重复绘制它以填充 View 的边界。执行此操作的算法非常简单。从左上角(或任何角落)开始,绘制图像,然后将 x 位置增加图像的宽度,然后再次绘制。当 x 位置超过 View 的最大 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

关于objective-c - 如何为窗口 cocoa 的一部分提供平铺图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com