[objective-c] NSView의 배경색을 변경하는 가장 좋은 방법

나는 변경하는 가장 좋은 방법을 찾고 있어요 backgroundColor의를 NSView. 또한에 적합한 alpha마스크 를 설정하고 싶습니다 NSView. 다음과 같은 것 :

myView.backgroundColor = [NSColor colorWithCalibratedRed:0.227f
                                                   green:0.251f
                                                    blue:0.337
                                                   alpha:0.8];

나는 NSWindow이 방법 을 가지고 있으며 NSColorWheel, 또는 NSImage배경 옵션에 대한 열렬한 팬이 아니지만 최선의 경우 기꺼이 사용하려고합니다.



답변

네, 당신의 대답은 옳았습니다. 코코아 방법을 사용할 수도 있습니다.

- (void)drawRect:(NSRect)dirtyRect {
    // set any NSColor for filling, say white:
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];
}

스위프트에서 :

class MyView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // #1d161d
        NSColor(red: 0x1d/255, green: 0x16/255, blue: 0x1d/255, alpha: 1).setFill()
        dirtyRect.fill()
    }

}


답변

쉽고 효율적인 솔루션은 Core Animation 레이어를 백업 저장소로 사용하도록 뷰를 구성하는 것입니다. 그런 다음 -[CALayer setBackgroundColor:]레이어의 배경색을 설정하는 데 사용할 수 있습니다 .

- (void)awakeFromNib {
   self.wantsLayer = YES;  // NSView will create a CALayer automatically
}

- (BOOL)wantsUpdateLayer {
   return YES;  // Tells NSView to call `updateLayer` instead of `drawRect:`
}

- (void)updateLayer {
   self.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.227f
                                                          green:0.251f
                                                           blue:0.337
                                                          alpha:0.8].CGColor;
}

그게 다야!


답변

스토리 보드 애호가라면 코드가 필요없는 방법입니다 .

NSBoxNSView에 서브 뷰로 추가 하고 NSView와 동일하게 NSBox의 프레임을 조정합니다.

스토리 보드 또는 XIB에서 제목 위치를 없음으로 변경하고 상자 유형을 사용자 정의로 , 테두리 유형을 “없음”으로, 테두리 색상을 원하는대로 변경하십시오.

스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


답변

먼저 WantsLayer를 YES로 설정하면 레이어 배경을 직접 조작 할 수 있습니다.

[self.view setWantsLayer:YES];
[self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];


답변

내가하는 방법을 알아 냈다고 생각하십시오.

- (void)drawRect:(NSRect)dirtyRect {
    // Fill in background Color
    CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
    CGContextSetRGBFillColor(context, 0.227,0.251,0.337,0.8);
    CGContextFillRect(context, NSRectToCGRect(dirtyRect));
}


답변

나는이 모든 대답을 겪었지만 불행히도 나를 위해 일한 사람은 없습니다. 그러나 약 1 시간의 검색 후이 매우 간단한 방법을 찾았습니다. 🙂

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);


답변

편집 / 업데이트 : Xcode 8.3.1 • Swift 3.1

extension NSView {
    var backgroundColor: NSColor? {
        get {
            guard let color = layer?.backgroundColor else { return nil }
            return NSColor(cgColor: color)
        }
        set {
            wantsLayer = true
            layer?.backgroundColor = newValue?.cgColor
        }
    }
}

용법:

let myView = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
print(myView.backgroundColor ?? "none")     //  NSView's background hasn't been set yet = nil
myView.backgroundColor = .red               // set NSView's background color to red color
print(myView.backgroundColor ?? "none")
view.addSubview(myView)