色を変更したいのですが、NSScrollViewとNSClipViewのどちらをサブクラス化するかわかりません。または、コーナーを通常のNSViewとして挿入できる場合。
(ソース:flickr.com)
コードは必要ありません。それを行う方法のヒント。
色を変更したいのですが、NSScrollViewとNSClipViewのどちらをサブクラス化するかわかりません。または、コーナーを通常のNSViewとして挿入できる場合。
(ソース:flickr.com)
コードは必要ありません。それを行う方法のヒント。
mekentosjによる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
ちょっと奇妙ですが、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()
}
}
}
オースティンの回答のSwift5.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()
}
}
}