MACOSX — Как настроить IKImageBrowserView для добавления NSButton к каждому элементу?

Я хочу настроить IKImageBrowserView, чтобы добавить NSButton или другой элемент управления в ячейку IKImageBrowserView. Я попытался сократить класс IKBrowserViewCell, но не понял, как и где добавить NSbutton, чтобы он отображался в IKBrowserViewItem. Вот код, который я пробовал до сих пор.

#import "ImageBrowserView.h"
#import "ImageBrowserCell.h"

- (IKImageBrowserCell *) newCellForRepresentedItem:(id) cell
{
    return [[ImageBrowserCell alloc] init];
}

В клеточном классе

- (CALayer *) layerForType:(NSString*) type
{
    CGColorRef color;

    //retrieve some usefull rects
    NSRect frame = [self frame];
    NSRect imageFrame = [self imageFrame];
    NSRect relativeImageFrame = NSMakeRect(imageFrame.origin.x - frame.origin.x, imageFrame.origin.y - frame.origin.y, imageFrame.size.width, imageFrame.size.height);

//   place holder layer 
    if(type == IKImageBrowserCellPlaceHolderLayer){
        //create a place holder layer
        CALayer *layer = [CALayer layer];
        layer.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);

        CALayer *placeHolderLayer = [CALayer layer];
        placeHolderLayer.frame = *(CGRect*) &relativeImageFrame;

        float fillComponents[4] = {1.0, 1.0, 1.0, 0.3};
        float strokeComponents[4] = {1.0, 1.0, 1.0, 0.9};
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

        //set a background color
        color = CGColorCreate(colorSpace, fillComponents);
        [placeHolderLayer setBackgroundColor:color];
        CFRelease(color);

        //set a stroke color
        color = CGColorCreate(colorSpace, strokeComponents);
        [placeHolderLayer setBorderColor:color];
        CFRelease(color);

        [placeHolderLayer setBorderWidth:2.0];
        [placeHolderLayer setCornerRadius:10];
        CFRelease(colorSpace);

        [layer addSublayer:placeHolderLayer];

        return layer;
    }
return nil;
}

Этот класс ячеек имеет метод для возврата кадра различных элементов управления IKImageBrowserCell и не позволяет добавлять его в качестве подпредставления. Я не понял, где я выделяю свой NSButton, чтобы я мог показать его на элементе. Пожалуйста помогите. Я уже потратил около 1 дня на это. Любая помощь будет ощутима. Спасибо


person Surjeet    schedule 05.09.2013    source источник


Ответы (1)


Вы движетесь в правильном направлении. Вам нужно проверить тип и добавить кнопки на слой переднего плана. Вот некоторый код из моего существующего проекта.

- (CALayer *)layerForType:(NSString *)type
{
    if (type == IKImageBrowserCellBackgroundLayer) {
        CALayer *layer = [CALayer layer];
        NSRect rect = [self frame];
        layer.frame = rect;
        _frameBg = rect;
        CGFloat cellSize = rect.size.height;

        SSLayerBackground *bgLayer = [SSLayerBackground layer];
        [layer addSublayer:bgLayer];
        [bgLayer setFrame:rect];
        bgLayer.position = NSMakePoint(rect.size.width/2.0, rect.size.height/2.0);
        [bgLayer setNeedsDisplay];

        /* Create background layer here */

        return layer;
    } else if (type == IKImageBrowserCellForegroundLayer) {
        CALayer *layer = [CALayer layer];
        NSRect rect = [self frame];
        layer.frame = rect;
        CGFloat cellSize = rect.size.width;


        /* Add your buttons to this layer */

        return layer;
    } else if (type == IKImageBrowserCellSelectionLayer) {
        CALayer *layer = [CALayer layer];
        NSRect rect = [self frame];
        layer.frame = rect;
        CGFloat cellSize = rect.size.height;

        /* Do selection layer stuff here */

        return layer;
    }
    //return nil;
    return [super layerForType:type];
}
person Justin Levi Winter    schedule 06.09.2013
comment
Есть ли другой способ добавить кнопку на передний слой, потому что, когда я пытаюсь добавить кнопку в ваш код, в IKIMageBrowserItem ничего не отображается. if (type == IKImageBrowserCellForegroundLayer) { NSButton btn = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, rect.size.width, 30)]; [кнопка setTitle:@Button]; [слой addSublayer:[btn слой]]; / Добавьте свои кнопки на этот слой */ } - person Surjeet; 07.09.2013