gpt4 book ai didi

objective-c - 子类化 NSCollectionView 后的绘图问题

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

好的,这就是我所做的:

  • 我有一个 NSCollectionView
  • 我希望能够启用“选择”项目,并在选择项目时绘制自定义边框
  • 我对 NSCollectionViewItem 进行了子类化(以启用选择)
  • 我为 NSCollectionViewItem View 创建了 NSView 子类,以便绘制边框
<小时/>

代码

查看项目

@implementation MSLibraryCollectionViewItem

- (void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setNeedsDisplay:YES];
}

自定义 View

@implementation MSLibraryCollectionViewView

/***************************************
Initialisation
***************************************/

- (MSLibraryCollectionViewView*)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}

return self;
}

/***************************************
Drawing
***************************************/

- (void)drawRect:(NSRect)rect
{
if ([self selected]) {
//[[NSColor redColor] setFill];
//NSRectFill(rect);
//[super drawRect:rect];

NSColor* gS = [NSColor colorWithCalibratedRed:0.06 green:0.45 blue:0.86 alpha:1.0];
NSColor* gE = [NSColor colorWithCalibratedRed:0.12 green:0.64 blue:0.94 alpha:1.0];
NSGradient* g = [[NSGradient alloc] initWithStartingColor:gE endingColor:gS];
NSColor *borderColor = [NSColor colorFromGradient:g];

NSRect frameRect = [self bounds];

if(rect.size.height < frameRect.size.height)
return;
NSRect newRect = NSMakeRect(rect.origin.x+5, rect.origin.y+5, rect.size.width-10, rect.size.height-10);

NSBezierPath *textViewSurround = [NSBezierPath bezierPathWithRoundedRect:newRect xRadius:7 yRadius:7];
[textViewSurround setLineWidth:2.0];
[borderColor set];
[textViewSurround stroke];
}
}

但是,绘图似乎有问题。例如:

  • 调整 Collection View 容器的大小时,外框处会出现一条奇怪的线
  • 当 Collection View 项不是 100% 可见时(例如,因为它已向下滚动),选择边框根本不会出现(虽然我希望它只绘制可见部分)。
<小时/>

一些示例

NSCollectionView selected item drawing issue

NSCollectionView drawing issue

发生什么事了?

<小时/>

P.S.我不是 Cocoa 中绘图和自定义 View 的专家 - 因此非常欢迎任何想法/帮助!

最佳答案

您从询问 Collection View 转向谈论大纲 View ,但我认为这只是一个精神问题。

  • When an Outline View item is not 100% visible (e.g. because it's been scrolled down), the selection border doesn't appear at all (while I would expect it to draw just the visible portion).

这是因为 -drawRect: 中的这段代码。

    if(rect.size.height < frameRect.size.height)
return;

它专门避免绘制部分选择轮廓。

关于奇怪的线,我怀疑这与您的收藏项 View 的自定义绘图有关。如果禁用自定义绘图,这种情况会停止发生吗?您可以尝试使用普通颜色,而不是使用您正在使用的第三方 +colorFromGradient: 代码。

顺便说一句,这一行:

    NSRect newRect = NSMakeRect(rect.origin.x+5, rect.origin.y+5, rect.size.width-10, rect.size.height-10);

可以更简单地写为:

    NSRect newRect = NSInsetRect(rect, 5, 5);

关于objective-c - 子类化 NSCollectionView 后的绘图问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26559860/

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