2013-03-14 16 views
5

Chciałbym przekazać informacje zwrotne, gdy mysz jest na jednej z komórek IKImageBrowserView.Jak mogę podświetlić komórki IKImageBrowserView na myszy?

W szczególności chciałbym nieco zmienić rozmiar komórki, aby była nieco większa po kliknięciu myszą. Ewentualnie podkreślenie tła/granicy byłoby w porządku.

Niestety, IKImageBrowserCell nie jest podklasą NSCell, ale raczej NSObject i nie mogę znaleźć rozwiązania w API. Jakieś pomysły?

Odpowiedz

2

Możesz spróbować podklasy IKImageBrowserView i dodając NSTrackingArea do widocznego rect. Następnie można było implement -mouseMoved: to work with the tracking area zlokalizować poprawną komórkę obrazu przy użyciu -indexOfItemAtPoint:, a następnie uzyskać jej ramkę za pomocą -itemFrameAtIndex:.

Zamiast wymieszać z warstwami i rysunkiem czarnej skrzynki IKImageBrowserView, możesz dodać własną warstwę (lub okno bez ramki) nad nowo odkrytą ramką i użyć standardowych animacji do powiększania/pomniejszania/animowania/blasku/drgań/cokolwiek ta "cheat" komórka. Niech kliknięcia "przejdą" (i ukryją komórkę "oszukiwania"), aby normalny mechanizm przeciągania i upuszczania działał tak samo. IKImageBrowserView ma własną metodę "setForegroundLayer:", która pozwala na dodanie "warstwy nakładki" - idealnie dopasowanej do tego celu, jak sobie wyobrażam.

To byłaby moja pierwsza próba rozwiązania tego problemu, gdyby to była moja własna.

+0

Jak dodać NSTrackingArea do IKImageBrowserView, jeśli metoda addTrackingArea: jest niedostępna (nie jest to widok)? – aneuryzm

+0

Błąd ... IKImageBrowserView * to * widok. W nazwie ma nawet słowo "Widok". Dziedziczy bezpośrednio * od * NSView, w rzeczywistości tak -addTrackingArea: jest dostępna; po prostu nie jest w referencji IKImageBrowserView (ponieważ jest w referencji NSView). :-) Ty ** zdecydowanie ** musisz poświęcić więcej czasu na uczenie się, jak przejść przez odniesienie do API jak ninja, ponieważ jego dziedzictwo (i link do NSView) znajduje się na samej górze jego strony referencyjnej. –

0

Mimo, że jest już odpowiedział (bez kodu), ale ja również natknąłem się na to samo wymaganie i wdrożyłem go przez podklasy IKImageBrowswerView. Poniżej znajduje się mój kod i mam nadzieję, że komuś to pomoże. Aby z niego skorzystać wystarczy ustawić klasę widoku przeglądarki obrazu w Xib/nib/storyboard na CustomIKImageBrowserView i dodać poniższe klasy do projektu.

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

I klasa wykonawczych jest:

#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 

A CustomizableNSView jest:

#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 

Mam nadzieję, że komuś pomóc i przyspieszyć rozwój.

Powiązane problemy