のセルの1つにマウスを置いたときに、フィードバックを提供したいと思いますIKImageBrowserView
。
具体的には、セルのサイズを少し変更して、マウスオーバー時に少し大きく表示されるようにします。または、背景/境界線を強調表示することもできます。
残念ながら、IKImageBrowserCell
はのサブクラスではNSCell
なくNSObject
、であり、APIで解決策を見つけることができません。何か案は?
のセルの1つにマウスを置いたときに、フィードバックを提供したいと思いますIKImageBrowserView
。
具体的には、セルのサイズを少し変更して、マウスオーバー時に少し大きく表示されるようにします。または、背景/境界線を強調表示することもできます。
残念ながら、IKImageBrowserCell
はのサブクラスではNSCell
なくNSObject
、であり、APIで解決策を見つけることができません。何か案は?
IKImageBrowserView をサブクラス化し、NSTrackingAreaを可視矩形に追加してみてください。次に、-mouseMoved: を実装して、追跡領域を操作し、 -indexOfItemAtPoint: を使用して正しい画像セルを見つけ、-itemFrameAtIndex:を使用してそのフレームを取得できます。
IKImageBrowserView のブラック ボックス レイヤーと描画をいじくりまわすのではなく、新しく発見されたフレームの上に独自のレイヤー (またはボーダレス ウィンドウ) を追加し、標準のアニメーションを使用して成長/縮小/アニメーション/グロー/シェイク/この「チート」を何でも使用できます。 "セル。通常のドラッグ アンド ドロップ メカニズムが同じように機能するように、クリックを「通過」させます (そして「チート」セルを非表示にします)。IKImageBrowserView には独自の -setForegroundLayer: メソッドがあり、「オーバーレイ レイヤー」を追加できます。この目的に最適だと思います。
それが私自身の問題であれば、それがこの問題を解決するための私の最初の試みです。
これはすでに回答されていますが (コードはありません)、私も同じ要件に遭遇し、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
それが誰かを助け、開発をスピードアップすることを願っています。