2015-05-19 63 views
0

我需要兩個與我的Mac OS X應用程序中的Pages應用程序類似的東西。請查看附帶的屏幕截圖。Mac OS X中的NSScrollView中的陰影應用程序

  1. 我需要NSScrollView上的陰影,如Mac OS X Pages應用中所示。
  2. 我想讓我的滾動條像Mac OS X Pages應用中的那個一樣。

UI comparing

回答

0
  1. 以上通過設置該視圖的定製選項CALayer取得的視圖的陰影。只需從IB檢查View Effects Inspector(或者您也可以通過編程的方式執行此操作 - read this
  2. 要刪除滾動視圖旋鈕的燈光樣式,請在IB中打開NSScrollView屬性檢查器,並將Scroller Knobs樣式選爲「默認樣式」(第二行)。
+0

您爲該圖層設置了哪些選項?設置一個陰影並不會覆蓋其他控件。 – Lupurus

0

獲取頂部陰影的快速簡便的方法是覆蓋封閉的剪輯視圖。然而,這並不理想,因爲它會在控件後面繪製陰影(實際上是漸變)。我覺得很好。

#import <Cocoa/Cocoa.h> 

// DFInvertedClipView.h 
IB_DESIGNABLE 
@interface DFInvertedClipView : NSClipView 
@property IBInspectable BOOL shouldDrawTopShadow; 
@end 

// DFInvertedClipView.m 
#import "DFInvertedClipView.h" 

@interface DFInvertedClipView() 
@property CGFloat startAlpha; 
@end 

@implementation DFInvertedClipView 

- (BOOL) isFlipped { 
    return true; 
} 

-(void) drawRect:(NSRect)dirtyRect 
{ 

    [super drawRect:dirtyRect]; 

    if (_shouldDrawTopShadow) { 

     NSGradient * gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.6 alpha:self.startAlpha] 
                   endingColor:[NSColor colorWithCalibratedWhite:0.6 alpha:0.0]]; 

     NSRect b = [self bounds]; 
     NSRect topFade = NSMakeRect(NSMinX(b), NSMinY(b), NSWidth(b), 5.0); 
     [gradient drawInRect:topFade angle:90]; 

     NSBezierPath *topLine = [NSBezierPath bezierPath]; 
     [topLine moveToPoint:NSMakePoint(NSMinX(self.bounds), NSMinY(self.bounds))]; 
     [topLine lineToPoint:NSMakePoint(NSMaxX(self.bounds), NSMinY(self.bounds))]; 

     CGFloat lineWidth = [[NSScreen mainScreen] backingScaleFactor]; 
     [topLine setLineWidth:lineWidth]; 
     [[NSColor colorWithCalibratedWhite:0.5 alpha:self.startAlpha] setStroke]; 
     [topLine stroke]; 
    } 


} 

-(void) scrollToPoint:(NSPoint)newOrigin 
{ 
    [super scrollToPoint:newOrigin]; 

    // Grade the shadow darkness based on the displacement from a flush fit 
    CGFloat displacementForFullShadow = 40.0; // pixels 
    if (newOrigin.y > 0) { 
     CGFloat alpha = 1.0/displacementForFullShadow * newOrigin.y; // e.g. linear grade function y = m*x + c (m = 1/displacementForFullShadow, c = 0.0) 
     if (alpha > 1.0) { 
      alpha = 1.0; 
     } 
     self.startAlpha = alpha; 
    } else { 
     self.startAlpha = 0.0; 
    } 
} 
相關問題