【问题标题】:NSCollectionView header displayNSCollectionView 标头显示
【发布时间】:2019-12-24 06:38:17
【问题描述】:

我有一个NSCollectionView,它有 3 个部分,其中包含来自调色板的颜色。我希望每个部分都有一个带有该部分名称的标题视图。乍一看,它似乎有效。在启动时,它看起来像这样:

但是,当我调整窗口大小时,标题文本最终会绘制在标题之外(并且也在其中,不知何故!):

为了在集合视图中有标题,我有一个名为 CollectionHeaderView 的标题视图类。我注册这个类作为补充视图:

    [_collection registerClass:[CollectionHeaderView class]
    forSupplementaryViewOfKind:@"UICollectionElementKindSectionHeader"
                withIdentifier:kSupplementalView];

在集合视图的委托中,我实现了返回补充元素视图的方法:

- (NSView *)collectionView:(NSCollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
               atIndexPath:(NSIndexPath *)indexPath {
    NSView* result = [collectionView makeSupplementaryViewOfKind:kind
                                                  withIdentifier:kSupplementalView
                                                    forIndexPath:indexPath];

    if ([kind isEqualToString:@"UICollectionElementKindSectionHeader"]) {
        NSTextField* textView = ((CollectionHeaderView*)result).textField;
        switch (indexPath.section) {
            case 0:
                [textView setStringValue:@"Bright Colors"];
                break;

            case 1:
                [textView setStringValue:@"Pastel Colors"];
                break;

            case 2:
                [textView setStringValue:@"Designer Colors"];
                break;
        }

        return textView;
    }

    return nil;
}

此外,如果我调整窗口大小,标题视图不会移动。集合元素似乎在标题周围流动,将内容列在错误的部分下。而且,正如您在上面的第二张图片中看到的那样,加宽窗口最终会在标题的右边缘和集合视图的右边缘之间留下一个间隙。

CollectionHeaderView 类非常简单。它只是创建一个文本字段并绘制背景和文本字段:

@implementation CollectionHeaderView

- (instancetype)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];

    if (self != nil) {
        NSRect textFrame = frameRect;
        _textField = [[NSTextField alloc] initWithFrame:textFrame];
        _textField.editable = NO;
        _textField.bordered = NO;
        _textField.font = [NSFont fontWithName:@"Helvetica-Bold" size:14.0];
        _textField.backgroundColor = [NSColor colorWithSRGBRed:0.0 green:0.0 blue:0.0 alpha:0.0];
        [self addSubview:_textField];

        self.identifier = kSupplementalView;
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
    NSBezierPath*   fillPath    = [NSBezierPath bezierPath];
    [fillPath appendBezierPathWithRect:dirtyRect];
    [[NSColor lightGrayColor] setFill];
    [fillPath fill];

    [_textField drawRect:dirtyRect];
}

@end

我是否错误地实施了上述任何方法?有没有我需要实现但我没有实现的方法?

【问题讨论】:

  • 尝试使用 const NSCollectionElementKindSectionHeader 代替字符串 @"UICollectionElementKindSectionHeader"
  • 不应该viewForSupplementaryElementOfKind 返回result 而不是textViewdrawRect: 应该只绘制自己,[_textField drawRect:dirtyRect] 会被自动调用。
  • 啊!你是对的!请随意回答,我会接受。

标签: objective-c macos nscollectionview


【解决方案1】:

collectionView:viewForSupplementaryElementOfKind:atIndexPath:的返回值是补充视图result

- (NSView *)collectionView:(NSCollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
               atIndexPath:(NSIndexPath *)indexPath {
    NSView* result = [collectionView makeSupplementaryViewOfKind:kind
                                                  withIdentifier:kSupplementalView
                                                    forIndexPath:indexPath];

    if ([kind isEqual:NSCollectionElementKindSectionHeader]) {
        NSTextField* textView = ((CollectionHeaderView*)result).textField;
        switch (indexPath.section) {
            case 0:
                [textView setStringValue:@"Bright Colors"];
                break;

            case 1:
                [textView setStringValue:@"Pastel Colors"];
                break;

            case 2:
                [textView setStringValue:@"Designer Colors"];
                break;
        }

        return result;
    }

    return nil;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多