Objective c 子类化NSCollectionView后的图形问题
好的,以下是我所做的:Objective c 子类化NSCollectionView后的图形问题,objective-c,cocoa,nsview,nscollectionview,nscollectionviewitem,Objective C,Cocoa,Nsview,Nscollectionview,Nscollectionviewitem,好的,以下是我所做的: 我有一个NSCollectionView 我希望能够启用“选择”项目,并在选择项目时绘制自定义边框 I子类NSCollectionViewItem(用于启用选择) 我将NSCollectionViewItem视图的NSView子类化,以便绘制边框 代码 查看项目 @implementation MSLibraryCollectionViewItem - (void)setSelected:(BOOL)flag { [super setSelected:fl
- 我有一个
NSCollectionView
- 我希望能够启用“选择”项目,并在选择项目时绘制自定义边框
- I子类
(用于启用选择)NSCollectionViewItem
- 我将
视图的NSCollectionViewItem
子类化,以便绘制边框NSView
代码 查看项目
@implementation MSLibraryCollectionViewItem
- (void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setSelected:flag];
[(MSLibraryCollectionViewView*)[self view] setNeedsDisplay:YES];
}
自定义视图
@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];
}
}
@实现MSLibraryCollectionViewView
/***************************************
初始化
***************************************/
-(MSLibraryCollectionViewView*)initWithFrame:(NSRect)frame
{
self=[super initWithFrame:frame];
如果(自我){
//这里是初始化代码。
}
回归自我;
}
/***************************************
绘画
***************************************/
-(void)drawRect:(NSRect)rect
{
如果([自选]){
//[[NSColor redColor]setFill];
//NSRectFill(rect);
//[超级drawRect:rect];
NSColor*gS=[NSColor COLOR WITH CALIBLED:0.06绿色:0.45蓝色:0.86阿尔法:1.0];
NSColor*gE=[NSColor COLOR WITH CALIBLED:0.12绿色:0.64蓝色:0.94阿尔法:1.0];
NSGradient*g=[[NSGradient alloc]initWithStartingColor:gE endingColor:gS];
NSColor*borderColor=[NSColor colorFromGradient:g];
NSRect frameRect=[自边界];
if(rect.size.height
然而,这张图似乎有点不对劲。例如:
- 调整集合视图容器的大小时,外部框中会出现一条奇怪的线
- 当集合视图项不是100%可见时(例如,因为它已向下滚动),选择边框根本不会出现(而我希望它只绘制可见部分)
一些例子 发生什么事了
p.S.我不是一个拥有可可绘图和自定义视图的大师,所以欢迎任何想法/帮助 您从询问集合视图切换到谈论大纲视图,但我认为这只是一个精神上的小问题
- 当大纲视图项不是100%可见时(例如,因为它已向下滚动),选择边框根本不会出现 (我希望它只画出可见的部分)
-drawRect:
中的代码
if(rect.size.height < frameRect.size.height)
return;
可以更简单地写为:
NSRect newRect = NSInsetRect(rect, 5, 5);
嗯,我的两个主要问题是我发布的关于
NSCollectionView
的问题和另一个关于大纲视图的问题——这就是为什么我的想法可能会混淆的原因!哈哈,让我试试,我会给你回复的!谢谢!我试着评论这条线,现在它确实划出了边界,但它造成了更糟糕的混乱。问题:你知道有什么方法可以将“滚动”NSCollectionView
到所选项目,这样它就不会被剪裁?嗯,我想我在这里找到了一些东西:。至于所选项目的奇怪绘图问题,我现在正在尝试使用NSBox
的方法,它看起来更加平滑…我再次查看了您的代码。您正在基于传入的rect
参数绘制路径。这是脏矩形与可见矩形相交。因为您希望选择指示器基于整个视图的大小,所以应该基于self.bounds
,而不是rect
。我也尝试了frameRect=[self-bounds]
。但那真是一团糟。尽管原因不同。我想我将不得不接受我的命运,而不是和drawRect:
太多乱搞——它通常以糟糕的结局告终。英雄联盟
NSRect newRect = NSInsetRect(rect, 5, 5);