本文介绍了MACOSX-如何自定义IKImageBrowserView在每个项目上添加一个NSButton?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想自定义IKImageBrowserView,以便可以在IKImageBrowserView的单元格上添加NSButton或其他控件.我试图将IKBrowserViewCell类自定义,但是我没有得到添加NSbutton的方式和位置,因此无法在IKBrowserViewItem上显示.这是我到目前为止尝试过的代码.

I want to customize IKImageBrowserView so that i can add NSButton or other control on cell of IKImageBrowserView. I tried to cutomize IKBrowserViewCell class, but i did not get how and where i add NSbutton, So that it display on IKBrowserViewItem.Here is the code i had tried till now.

#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天的时间.任何帮助都是可观的.谢谢

This cell class have method to return the frame of various control of IKImageBrowserCell and does not allow to add as subview.I did not get where i allocate my NSButton so that i can show then on item.Please help me. I already wasted about 1 day on this.Any help be appreciable.Thanks

推荐答案

您的方向正确.您需要检查类型并将按钮添加到前景"层.这是我现有项目的一些代码.

You're headed in the right direction. You need to check the type and add the buttons to the Foreground layer. Here's some code from an existing project of mine.

- (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];
}

这篇关于MACOSX-如何自定义IKImageBrowserView在每个项目上添加一个NSButton?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 13:41