Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 子类化NSCollectionView后的图形问题_Objective C_Cocoa_Nsview_Nscollectionview_Nscollectionviewitem - Fatal编程技术网

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);