5

のセルの1つにマウスを置いたときに、フィードバックを提供したいと思いますIKImageBrowserView

具体的には、セルのサイズを少し変更して、マウスオーバー時に少し大きく表示されるようにします。または、背景/境界線を強調表示することもできます。

残念ながら、IKImageBrowserCellはのサブクラスではNSCellなくNSObject、であり、APIで解決策を見つけることができません。何か案は?

4

2 に答える 2

2

IKImageBrowserView をサブクラス化し、NSTrackingAreaを可視矩形に追加してみてください。次に、-mouseMoved: を実装して、追跡領域を操作し、 -indexOfItemAtPoint: を使用して正しい画像セルを見つけ、-itemFrameAtIndex:使用してそのフレームを取得できます。

IKImageBrowserView のブラック ボックス レイヤーと描画をいじくりまわすのではなく、新しく発見されたフレームの上に独自のレイヤー (またはボーダレス ウィンドウ) を追加し、標準のアニメーションを使用して成長/縮小/アニメーション/グロー/シェイク/この「チート」を何でも使用できます。 "セル。通常のドラッグ アンド ドロップ メカニズムが同じように機能するように、クリックを「通過」させます (そして「チート」セルを非表示にします)。IKImageBrowserView には独自の -setForegroundLayer: メソッドがあり、「オーバーレイ レイヤー」を追加できます。この目的に最適だと思います。

それが私自身の問題であれば、それがこの問題を解決するための私の最初の試みです。

于 2013-03-23T17:13:01.897 に答える
0

これはすでに回答されていますが (コードはありません)、私も同じ要件に遭遇し、IKImageBrowswerView をサブクラス化して実装しました。以下は私のコードであり、誰かに役立つことを願っています。これを使用するには、xib/nib/storyboard の画像ブラウザー ビューのクラスを CustomIKImageBrowserView に設定し、以下のクラスをプロジェクトに追加します。

     #import <Quartz/Quartz.h>
    #import "CustomizableNSView.h"
    @interface CustomIKImageBrowserView : IKImageBrowserView
    {
        NSTrackingArea *trackingArea;
        NSInteger lastHoverIndex;
        CustomizableNSView *hoverView ;
    }
    @end

実装クラスは次のとおりです。

#import "CustomIKImageBrowserView.h"

    @implementation CustomIKImageBrowserView

- (void)awakeFromNib {
    [self addCustomTrackingAreaToChangeMouseCursor];
}

- (void) updateTrackingAreas {
    if (trackingArea)
        [self removeTrackingArea:trackingArea];
    [self addCustomTrackingAreaToChangeMouseCursor];
}

- (void) addCustomTrackingAreaToChangeMouseCursor{
    trackingArea = [[NSTrackingArea alloc]  initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingMouseMoved owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void) mouseMoved:(NSEvent *)theEvent{
    NSPoint currentPosition = [self convertPoint:[theEvent locationInWindow] fromView:nil];

    NSInteger idx  = [self indexOfItemAtPoint:currentPosition];
    if(idx != NSNotFound) {
        [[NSCursor pointingHandCursor] push];
        //NSLog(@"DslrIKImageBrowserView = %ld and %ld",idx,lastHoverIndex);
        if (lastHoverIndex == idx) {
            return;
        } else {
            if(hoverView)
                [hoverView removeFromSuperview];
        }

        lastHoverIndex = idx;
        IKImageBrowserCell *cell = [self cellForItemAtIndex:idx];
        NSRect r = cell.imageFrame;
        r.size.width = r.size.width + 6;
        r.size.height = r.size.height + 6;
        r.origin.x = r.origin.x - 3;
        r.origin.y = r.origin.y - 3 ;

        hoverView = [[CustomizableNSView alloc] initWithFrame:r];
        hoverView.borderColor   = [NSColor colorWithCalibratedRed:136/255.0 green:185/255.0 blue:236/255.0 alpha:1.0];
        hoverView.borderRadious = 0;
        hoverView.borderWidth   = 6;
        hoverView.backgroundColor = [NSColor colorWithCalibratedRed:0 green:191.0/255.0 blue:1.0 alpha:0.3];
        [self.superview addSubview:hoverView];

    } else
    {
        lastHoverIndex = -1;
        [[NSCursor arrowCursor] push];
        if(hoverView)
            [hoverView removeFromSuperview];
    }
}

- (void)mouseEntered:(NSEvent *)theEvent{
    [[NSCursor pointingHandCursor] push];
}

- (void) mouseExited:(NSEvent *)theEvent{
    //[[NSCursor arrowCursor] push];
    lastHoverIndex = -1;
    if(hoverView) [hoverView removeFromSuperview];
} @end

そして、CustomizableNSView は次のとおりです。

#import <Cocoa/Cocoa.h>

@interface CustomizableNSView : NSView
{

}
@property (nonatomic) NSRect boundsToCustomize;
@property (nonatomic) CGFloat borderWidth;
@property (nonatomic) CGFloat borderRadious;
@property (nonatomic) NSColor *borderColor;
@property (nonatomic) NSColor *backgroundColor;


@end
=================
#import "CustomizableNSView.h"

@implementation CustomizableNSView


- (void)drawRect:(NSRect)dirtyRect {

    [super drawRect:dirtyRect];
    NSRect r = self.bounds;

    if(!NSIsEmptyRect(self.boundsToCustomize))
        r = self.boundsToCustomize;
    if(self.borderColor){
        NSBezierPath * bgPath = [NSBezierPath bezierPathWithRoundedRect: r xRadius: self.borderRadious yRadius: self.borderRadious];
        bgPath.lineWidth = self.borderWidth;
        NSAffineTransform * t = [NSAffineTransform transform];
        [t translateXBy: 0.5 yBy: 0.5];
        [bgPath transformUsingAffineTransform: t];
        //NSColor* rgbColor = [NSColor colorWithCalibratedRed:101.0/255.0 green: 101.0/255.0  blue:101.0/255.0  alpha:0.5];
        [self.borderColor set];
        [bgPath stroke];

        if(self.backgroundColor){
            [self.backgroundColor set];
            [bgPath fill];
        }
    }


}
@end

それが誰かを助け、開発をスピードアップすることを願っています。

于 2016-06-17T00:59:04.137 に答える