【问题标题】:How to fill the right bottom corner of NSScrollView?如何填充NSScrollView的右下角?
【发布时间】:2010-08-05 09:16:23
【问题描述】:

我想改变它的颜色,但我不确定是继承 NSScrollView 还是 NSClipView。或者,如果可以将角插入为常规 NSView。


(来源:flickr.com

我不需要代码。只是提示如何做到这一点。

【问题讨论】:

    标签: cocoa nsscrollview


    【解决方案1】:

    mekentosj 已经answered elsewhere on stackoverflow。要子类化的类是 NSScrollView。

    @interface MyScrollView : NSScrollView {
    }
    @end
    
    
    @implementation MyScrollView
    
    - (void)drawRect:(NSRect)rect{
        [super drawRect: rect];
    
        if([self hasVerticalScroller] && [self hasHorizontalScroller]){
            NSRect vframe = [[self verticalScroller]frame];
            NSRect hframe = [[self horizontalScroller]frame];
            NSRect corner;
            corner.origin.x = NSMaxX(hframe);
            corner.origin.y = NSMinY(hframe);
            corner.size.width = NSWidth(vframe);
            corner.size.height = NSHeight(hframe);
    
            // your custom drawing in the corner rect here
            [[NSColor redColor] set];
            NSRectFill(corner);
        }
    }
    @end
    

    【讨论】:

      【解决方案2】:

      有点奇怪,但只是将 NSScrollView 子类化并使用 super.drawRect() 覆盖绘制使我的 NSScrollView(不是)用白色填充那个角落。我测试了 2 次以确保,因为它没有多大意义。

      import Cocoa
      
      class ThemedScrollView: NSScrollView {
          override func drawRect(dirtyRect: NSRect) {
              super.drawRect(dirtyRect)
          }
      }
      

      这也是原始答案的 Swift 变体:

      import Cocoa
      
      class ThemedScrollView: NSScrollView {
      
          override func drawRect(dirtyRect: NSRect) {
              super.drawRect(dirtyRect)
      
              if hasVerticalScroller && hasHorizontalScroller {
                  guard verticalScroller != nil && horizontalScroller != nil else { return }
      
                  let vFrame = verticalScroller!.frame
                  let hFrame = horizontalScroller!.frame
                  let square = NSRect(origin: CGPoint(x: hFrame.maxX, y: vFrame.maxY), size: CGSize(width: vFrame.width, height: hFrame.height))
      
                  let path = NSBezierPath(rect: square)
                  let fillColor = NSColor.redColor()
                  fillColor.set()
                  path.fill()
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        更新了奥斯汀答案的 Swift 5.2 版本

        class Themed: NSScrollView {
        
            override func draw(_ dirtyRect: NSRect) {
                super.draw(dirtyRect)
        
                if hasVerticalScroller && hasHorizontalScroller {
                    guard verticalScroller != nil && horizontalScroller != nil else { return }
        
                    let vFrame = verticalScroller!.frame
                    let hFrame = horizontalScroller!.frame
                    let square = NSRect(origin: CGPoint(x: hFrame.maxX, y: vFrame.maxY), size: CGSize(width: vFrame.width, height: hFrame.height))
        
                    let path = NSBezierPath(rect: square)
                    let fillColor = NSColor.red
                    fillColor.set()
                    path.fill()
                }
            }
        }
        
        

        【讨论】:

          猜你喜欢
          • 2019-03-06
          • 2023-03-12
          • 1970-01-01
          • 2015-11-19
          • 2020-07-17
          • 1970-01-01
          • 2011-03-20
          • 2015-02-12
          • 1970-01-01
          相关资源
          最近更新 更多