OS X应用程序中的标准高亮颜色为蓝色。更改基于视图的NSTableView的选择颜色
是否可以将其更改为另一种颜色,例如灰色?
请注意,我正在使用从OS X 10.7开始提供的新的基于视图的NSTableView
。
OS X应用程序中的标准高亮颜色为蓝色。更改基于视图的NSTableView的选择颜色
是否可以将其更改为另一种颜色,例如灰色?
请注意,我正在使用从OS X 10.7开始提供的新的基于视图的NSTableView
。
由于您使用基于NSTableView的观点,你也可以继承NSTableRowView,它养活表委托方法- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row;
,然后自定义你在该行视图类的选择。
下面是一个例子:
- (void)drawSelectionInRect:(NSRect)dirtyRect {
if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) {
NSRect selectionRect = NSInsetRect(self.bounds, 2.5, 2.5);
[[NSColor colorWithCalibratedWhite:.65 alpha:1.0] setStroke];
[[NSColor colorWithCalibratedWhite:.82 alpha:1.0] setFill];
NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect xRadius:6 yRadius:6];
[selectionPath fill];
[selectionPath stroke];
}
}
在我看来有一个选项可以改变这个因为文件说三种选择风格和默认的风格在常规是蓝色的,看看下面的图像..你需要发送一条消息,我不能图因为我从来没有开发过苹果之前的应用程序..希望这可以帮助...!
你必须继承NSTableView
,并改写以下功能以改变交替的颜色。
(void) drawRow: (NSInteger) row clipRect: (NSRect) clipRect
(void) drawBackgroundInClipRect: (NSRect) clipRect
**此一个改变主及备用颜色**
使用for循环和插入该条件(i % 2 == 0)
以检测奇数和偶数行。
为了澄清,这不是针对问题提出的基于视图的NSTableviews的正确答案。你应该只覆盖上面的基于单元格。 – dbainbridge 2013-03-04 14:44:48
使用下面的代码响应于所述NSTableViewDelegate
协议tableViewSelectionDidChange
:
获取NSTableRowView
对于选择的行和调用该方法setEmphasized
就可以了。 当setEmphasized
设置为YES时,您会看到蓝色突出显示,否则您会看到灰色突出显示。
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSInteger selectedRow = [myTableView selectedRow];
NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setEmphasized:NO];
}
谢谢。这真的是一个有用的答案。 – Vignesh 2014-05-12 08:16:54
这给蓝色和灰色的舞蹈效果......不好的用户体验。 – 2014-08-11 12:15:43
当我们第一次点击该行时,该解决方案不起作用。从第二次点击它将工作。 – CrazyCoder 2015-06-18 13:04:02
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
[tblCategory enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){
CustomMainCell *cellView = [rowView viewAtColumn:0];
if(rowView.selected){
cellView.txtFieldTitle.textColor=[NSColor colorWithCalibratedRed:245.0/255.0 green:110.0/255.0 blue:65.0/255.0 alpha:1.0];
}else{
cellView.txtFieldTitle.textColor=[NSColor whiteColor];
}
}];
}
[tblCategory setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
Use this Notification for NSTableView:
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
//You Logic stuff
}
一些修改让 - 皮埃尔·答案
使用以下响应NSTableViewDelegate协议tableViewSelectionDidChange代码:
获取NSTableRowView对于选择的行并调用该方法setEmphasized就可以了。当setEmphasized设置为YES时,您会看到蓝色突出显示,否则显示灰色突出显示。
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSInteger selectedRow = [myTableView selectedRow];
NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO];
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular];
[myRowView setEmphasized:NO];
}
,避免蓝色然后灰集
[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
我的工作,但它最小化应用程序,并再次打开它,它再次它蓝色 – Nininea 2016-11-10 12:36:49
在使用雨燕可以在10.10查看基于细胞做
子类NSTableCellView
的舞蹈效果,实现这一点:
//override to change background color on highlight
override var backgroundStyle:NSBackgroundStyle{
//check value when the style was setted
didSet{
//if it is dark the cell is highlighted -> apply the app color to it
if backgroundStyle == .Dark{
self.layer!.backgroundColor = yourColor
}
//else go back to the standard color
else{
self.layer!.backgroundColor = NSColor.clearColor().CGColor
}
}
}
请注意,NSTableView
高亮样式必须设置为Regular
,如果它在SourceList
上,会导致一些奇怪的剪辑。
这不是最干净的解决方案,但它的作品好就约塞米蒂
如前所述,设置强调属性设置为false,但这样做在自定义NSTableRowView类避免副作用(喜欢跳舞的色彩效果):
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
self.emphasized = false
}
这是James Chen在Swift 3中的解决方案。我还添加了委托方法。
class MyNSTableRowView: NSTableRowView {
override func drawSelection(in dirtyRect: NSRect) {
if self.selectionHighlightStyle != .none {
let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
NSColor(calibratedWhite: 0.65, alpha: 1).setStroke()
NSColor(calibratedWhite: 0.82, alpha: 1).setFill()
let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 6, yRadius: 6)
selectionPath.fill()
selectionPath.stroke()
}
}
}
NSTableViewDelegate:
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
return MyNSTableRowView()
}
谢谢,这对我来说<3 – 2017-10-30 06:43:26
好了,所以我知道它已经有一个公认的答案,但对于像我这样的人有NSOutlineView
工作,具有.selectionHighlightStyle = .sourceList
可以使用此代码来进行选择灰色。此方法在更改选择时不会闪烁,并且在应用程序最小化时也会保持灰色。
NSTableView的/ NSOutlineView代表:
func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView?
{
let row : CustomRowView = CustomRowView.init()
row.identifier = "row"
return row
}
,然后创建一个新的文件CustomRowView.swift
此:
class CustomRowView : NSTableRowView
{
override var isEmphasized: Bool {
get { return self.isEmphasized }
set(isEmp) { self.isEmphasized = false }
}
}
这将让选择灰色的时刻。
这是让 - 皮埃尔在Swift3回答:
func tableViewSelectionDidChange(_ notification: Notification)
{
index = tableView.selectedRow
let rowView = tableView.rowView(atRow: index, makeIfNecessary: false)
rowView?.isEmphasized = false
...
它上面列出的两个限制 - 第一次点击不起作用,第二次点击一样。而且,还有一种“跳舞效应”。我不介意第一个,也不喜欢第二个。
我已经混合了前面描述过的所有方法,并获得了完全按照我的意愿做的代码。
出现任何奇怪的外边框和其他剩菜。
class AudioCellView: NSTableRowView {
...
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
self.wantsLayer = true
self.layer?.backgroundColor = NSColor.white.cgColor
}
override var isEmphasized: Bool {
set {}
get {
return false
}
}
override var selectionHighlightStyle: NSTableViewSelectionHighlightStyle {
set {}
get {
return .regular
}
}
override func drawSelection(in dirtyRect: NSRect) {
if self.selectionHighlightStyle != .none {
let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
NSColor(calibratedWhite: 0.85, alpha: 0.6).setFill()
let selectionPath = NSBezierPath.init(rect: selectionRect)
selectionPath.fill()
}
}
谢谢!它像一个魅力! – Dev 2012-03-07 12:39:17
谢谢! :) awesome – 2014-03-04 06:09:38
[WWDC 2011 session 120“基于NSTableView Basic的高级视图”](https://developer.apple.com/videos/wwdc/2011/)给出了一个类似的例子,并且还描述了如何实现不同的颜色,关于该表是否是firstResponder /“主动选择”/“强调”。 – Ashley 2014-08-02 16:50:33