gpt4 book ai didi

cocoa - 自定义 NSScroller 问题

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

我正在尝试对 NSScroller 进行子类化,以便绘制我自己的滚动旋钮。为此,我对 NSScrollView 进行了子类化,并使用以下代码来实例化我的自定义 NSScrollers:

- (void)awakeFromNib;
{
NSRect horizontalScrollerFrame = [[self horizontalScroller] frame];
NSRect verticalScrollerFrame = [[self verticalScroller] frame];
NSString *scrollBarVariant = [[[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain] valueForKey:@"AppleScrollBarVariant"];

if (![scrollBarVariant isEqualToString:@"DoubleBoth"]) {
[self setVerticalScroller:[[[TRScroller alloc] initWithFrame:verticalScrollerFrame] autorelease]];
[self setHorizontalScroller:[[[TRScroller alloc] initWithFrame:horizontalScrollerFrame] autorelease]];
}
}

这有效并且我的 NSScrollers 显示正确。但我偶尔会在首次加载应用程序时看到渲染问题。在 Interface Builder 中,我布置了许多 NSScrollView,并将它们的滚动条设置为自动隐藏。我看到的问题是,当应用程序首次加载时,滚动条背景会在 NSScrollViews 内容中呈现。

alt text http://www.freeimagehosting.net/uploads/1d3fc75db8.png

我相信这是因为我通过 awakeFromNib 实例化了我的 NSScroll 子类(TRSubclass),这意味着滚动条在自动调整大小以满足窗口保存的位置和大小之前被赋予了 NSScrollView 的框架(换句话说,它是使用 Interface Builder 中默认分配的框架)。解决这个问题的最佳方法是什么?

我尝试强制 NSScrollView 重新显示(使用 setNeedsDisplay: 和 display:),但没有成功。还有其他人遇到过类似的问题吗?

最佳答案

我在我的应用程序中使用相同的模式,并且我经常与这个问题作斗争。我使用相同的技巧:在 [scrollView awakeFromNib] 方法中替换滚动条,但目前我没有遇到此类渲染问题。您可以尝试使用 NSScrollView 的“绘制背景”属性 - 有时它确实很有帮助

- (void)changeSubs
{
// change clip view
// ...

// change scrollers
NSRect horizontalScrollerFrame = [[self horizontalScroller] frame];
NSRect verticalScrollerFrame = [[self verticalScroller] frame];
if (![[self verticalScroller] isKindOfClass:[CRScroller class]])
[self setVerticalScroller:[[[CRScroller alloc] initWithFrame:verticalScrollerFrame] autorelease]];
if (![[self horizontalScroller] isKindOfClass:[CRScroller class]])
[self setHorizontalScroller:[[[CRScroller alloc] initWithFrame:horizontalScrollerFrame] autorelease]];
}

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[self changeSubs];
}
return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
NSKeyedUnarchiver* unpacker = (id)aDecoder;
[unpacker setClass:[CRClipView class] forClassName:[NSClipView className]];
[unpacker setClass:[CRScroller class] forClassName:[NSScroller className]];

self = [super initWithCoder:aDecoder];
if (self)
{
}
return self;
}

- (void)awakeFromNib
{
[self changeSubs];
}

这里有一些技巧,它们的工作原理取决于 NSScrollView 的创建方式。 “isKindOfClass”检查有助于避免双重交换。

关于cocoa - 自定义 NSScroller 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3256113/

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