5

NSPopUpButton 矢印の色をカスタマイズする方法はありますか? いろいろ調べたけど答えはまだ出てない

4

5 に答える 5

1

これを行うための「簡単な」方法があるとは本当に思いません。API の説明を見ると、setImage ルーチンに応答しないとさえ記載されています。私はボタンオブジェクトなどをサブクラス化するかなりの作業を行ってきました...そして、これはあなたが求めていることをするためにあなたが行かなければならない場所だと思います.

于 2012-06-01T19:14:11.533 に答える
0

画像を使わずに「False Color」フィルターを使って矢印の色を変えてみました。これまでのところ、カカオコントロールを私に変える最も簡単な方法です.

class RLPopUpButton: NSPopUpButton {
init() {
    super.init(frame: NSZeroRect, pullsDown: false)
    addFilter()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    addFilter()
}

func addFilter() {
    let colorFilter = CIFilter(name: "CIFalseColor")!
    colorFilter.setDefaults()
    colorFilter.setValue(CIColor(cgColor: NSColor.black.cgColor), forKey: "inputColor0")
    colorFilter.setValue(CIColor(cgColor: NSColor.white.cgColor), forKey: "inputColor1")

//        colorFilter.setValue(CIColor(cgColor: NSColor.yellow.cgColor), forKey: "inputColor0")
//        colorFilter.setValue(CIColor(cgColor: NSColor.property.cgColor), forKey: "inputColor1")

    self.contentFilters = [colorFilter]
}
}
于 2018-09-18T14:09:15.290 に答える
0

スイフト5

インターフェイス ビルダーで、デフォルトの矢印設定を削除します。次に、このサブクラスをセルに適用します。これにより、NSImageView が NSPopUpButton の右側に追加されます。

このようにして、カスタム ボタンとして何を設定し、どのように配置するかを完全に制御できます。

import Cocoa

@IBDesignable class NSPopUpButtonCellBase: NSPopUpButtonCell {
    
    let textColor = NSColor(named: "white")!
    let leftPadding: CGFloat = 16
    let rightPadding: CGFloat = 30

    override func awakeFromNib() {
        super.awakeFromNib()
        
        let imageView = NSImageView()
        imageView.image = NSImage(named: "ic_chevron_down")!

        controlView!.addSubview(imageView)
        
        imageView.translatesAutoresizingMaskIntoConstraints = false
        
        imageView.widthAnchor.constraint(equalToConstant: CGFloat(20)).isActive = true
        imageView.heightAnchor.constraint(equalToConstant: CGFloat(20)).isActive = true
        imageView.trailingAnchor.constraint(equalTo: controlView!.trailingAnchor).isActive = true
        imageView.centerYAnchor.constraint(equalTo: controlView!.centerYAnchor).isActive = true
    }
    
    // overriding this removes the white container
    override func drawBezel(withFrame frame: NSRect, in controlView: NSView) {
        
    }
    
    // overriding this allows us to modify paddings to text
    override func titleRect(forBounds cellFrame: NSRect) -> NSRect {
        // this gets rect, which has title's height, not the whole control's height
        // also, it's origin.y is such that it centers title
        let processedTitleFrame = super.titleRect(forBounds: cellFrame)

        let paddedFrame = NSRect(
            x: cellFrame.origin.x + leftPadding,
            y: processedTitleFrame.origin.y,
            width: cellFrame.size.width - leftPadding - rightPadding,
            height: processedTitleFrame.size.height
        )

        return paddedFrame
    }

    // overriding this allows us to style text
    override func drawTitle(_ title: NSAttributedString, withFrame frame: NSRect, in controlView: NSView) -> NSRect {
        let attributedTitle = NSMutableAttributedString.init(attributedString: title)
        let range = NSMakeRange(0, attributedTitle.length)
        attributedTitle.addAttributes([NSAttributedString.Key.foregroundColor : textColor], range: range)

        return super.drawTitle(attributedTitle, withFrame: frame, in: controlView)
    }
}
于 2021-02-12T11:38:37.030 に答える