本文翻译自:Button Programming Topics(更新日期:2014-10-16
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Button/Button.html#//apple_ref/doc/uid/10000019i
文章目录
一、按钮简介
按钮是一个用户交互界面对象,单击时向目标发送操作消息。
您应该阅读本文档以了解Cocoa提供的不同类型的按钮以及如何使用它们。
本文件的组织
本文档描述了如何使用按钮。
这些文章为您提供有关不同类型按钮的基本信息,以及如何自定义按钮:
- 按钮如何工作描述按钮如何工作。
- 按钮的类型描述了按钮的类型、它们的行为方式、按下时如何突出显示以及是否显示其状态。
- 使用按钮说明如何使用按钮。
- 使用复选框解释了如何在矩阵对象中使用复选框。
- 使用单选按钮说明如何在矩阵对象中使用单选按钮。
- 查询按钮矩阵显示如何处理单选按钮和复选框中的选择。
- 设置按钮边框的外观描述了如何更改边框的形状和分级。
- 设置按钮的标题描述了如何更改按钮标题的内容和外观。
- 设置按钮的图像描述了如何更改按钮图像的内容和外观。
- 隐藏一个按钮描述了如何使按钮不可见或仅当鼠标在其上方时才显示其边框。
- 设置一个按钮的键等效描述了如何附加一个键等效于一个按钮。
- 子类化NSButton描述了如何子类化
NSButton
。
其他文件中的以下文章也包含相关信息:
二、按钮如何工作
按钮遵循目标-动作设计模式。
按钮是一个用户交互界面对象,单击时它会向目标发送动作消息。
有关此设计模式的更多信息,请参阅 Objective-C编程中概念中 的目标-动作。
按钮的大部分工作由NSButtonCell
类处理。
如果单击NSButtonCell
实例的视图并获得鼠标向下事件,则该实例会向目标发送一次操作消息,但只要鼠标按住按钮单元格内的光标,该实例也可以连续发送操作消息。
按钮单元格可以通过多种方式突出显示它正在被按下——例如,一个带边框的按钮单元格可以被推到屏幕上,或者在按下按钮单元格时图像或标题可以更改为替代形式。
一个NSButtonCell
对象必须与NSControl
的子类实例一起使用。
如果需要一个按钮,例如按钮,请使用包含单个NSButtonCell
实例的NSButton
对象。
如果需要一组相关按钮,例如一组开关或单选按钮,请使用包含多个NSButtonCell
实例的NSMatrix
对象。
NSButton
和NSMatrix
都提供了控制视图。
然而,虽然NSMatrix
要求您直接访问NSButtonCell
对象,但NSButton
的大多数方法都是NSButtonCell
中相同声明方法的“覆盖”(换句话说,NSButton
方法的实现为您调用相应的NSButtonCell
方法,允许您不关心NSButtonCell
对象的存在。)唯一没有覆盖的NSButtonCell
方法与用于显示等效键的字体以及突出显示或显示NSButton
状态的特定方法有关(最后这些通常与NSButton
的setButtonType:
方法一起设置)。
三、按钮类型
按钮类型决定了按钮的行为方式:按下时如何突出显示以及是否显示其状态。
按钮类型分为三类:
您可以使用setButtonType设置setButtonType:
。
1、Push 按钮
这些按钮对于触发操作最有用,因为它们不显示它们的状态。
按住鼠标按钮时,它们会改变外观,松开鼠标按钮时,它们会恢复到原来的外观。
- 要让
NSButton
控制正在按下的按钮的外观,请使用NSMomentaryPushInButton
(在Interface Builder的按钮检查器中称为“瞬间推送”)。
当鼠标按钮向下时,按钮看起来像是被推进去的。
下面是一个边框样式为NSRoundedBezelStyle
的NSMomentaryPushInButton
按钮示例,包括普通外观和内推外观:
这是一个带有边框样式NSThickerSquareBezelStyle
的NSMomentaryPushInButton
按钮的示例。
边框样式NSRegularSquareBezelStyle
和NSThickSquareBezelStyle
相似。
- 要控制自己按下按钮的外观,请使用
NSMomentaryChangeButton
(在Interface Builder的按钮检查器中称为“瞬间更改”)。
当鼠标按钮按下时,它会显示备用图像和备用标题。
当鼠标按钮松开时,它会显示正常图像和标题。
如果您没有为按钮设置备用图像或名称,它的外观不会改变。
2、Sticky 按钮
这些按钮显示它们的状态,按下时看起来会粘在一起。
单击一个后,它似乎会保持按下状态,直到您再次单击它。
- 要让
NSButton
控制按下按钮的外观,请使用NSPushOnPushOffButton
(在Interface Builder的按钮检查器中称为“Push On/Push off”)。
单击一次后,按钮似乎被推入。
再次单击后,按钮似乎弹出。
弹出的外观用于关闭状态(NSOffState
),按下的外观用于打开和混合状态(NSOnState
和NSMixedState
)。
这对于显示应用程序中某些内容状态的按钮很有用(例如,显示所选文本是否为粗体的按钮)。 - 要控制按下按钮的外观,请使用
NSToggleButton
(在Interface Builder的按钮检查器中称为“切换”)。
单击一次后,按钮显示其备用图像和标题。
再次单击后,按钮显示其正常图像和标题。
如果没有备用图像或标题,按钮的外观不会改变。
正常图像和标题用于关闭状态(NSOffState
),备用图像和标题用于打开和混合状态(NSOnState
和NSMixedState
)。
这对于在两个操作之间切换的按钮很有用(例如,停止和开始)。
如果您希望按钮显示所有三种状态的不同外观,则必须子类化NSButton
。
3、Radio(单选)按钮和Checkboxes(复选框)
这些按钮显示应用程序中某些东西的状态。
它们是具有系统定义图像的NSToggleButton
的专用版本。
- 要在两个选项之间进行选择,请使用
NSSwitchButton
,它看起来像一个复选框。
这种类型的按钮在Interface Builder中作为单独的调色板项提供。
- 要在两个以上的选项中进行选择,请使用
NSRadioButton
按钮矩阵。
矩阵和单选按钮协同工作以确保一次只打开一个按钮。
这种类型的按钮在Interface Builder中作为单独的调色板项目提供。
更改用于这些按钮的图像可能会导致不可预测的结果。
如果您想要具有自定义外观的开关或单选按钮,请自定义切换按钮或子类NSButton
。
虽然复选框和单选按钮可以为所有三种状态显示不同的图像,但其他类型的按钮不能。
四、使用Push按钮
按钮执行按钮名称描述的操作。
通常,它是一个圆角矩形,里面包含它的名称。
例如,此按钮可能出现在查找文档中文本的对话框中:
在Interface Builder中创建按钮是最简单的。
您也可以通过创建一个NSButton
实例来以编程方式创建一个按钮,该实例具有NSMomentaryPushInButton
类型、NSNoImage
的图像位置和NSRoundedBezelStyle
的边框。
您还可以有一个图标按钮按钮;也就是说,一个主要由其图标标识的按钮,很少或没有文本。
它是矩形的,如下所示:
您可以在Interface Builder中或以编程方式创建图标按钮。
如果您使用Interface Builder,请从常规按钮开始。
如果您以编程方式创建它,请创建一个NSButton
实例,然后将其类型设置为NSMomentaryPushInButton
,将其图像位置设置为NSImageOnly
,将其边框类型设置为方形边框类型。
最后,将图像设置为您想要的。
注意:文本按钮上可以有一个小图像,图标按钮可以有一个标签。
重要的问题是什么最突出。
如果是文本,请将其视为文本按钮。
如果是图像,请将其视为图标按钮。
您还可以有一个在两种状态之间切换的按钮,每个状态都有自己的标题和图像。
例如,一个按钮可以在开始和停止之间切换。
您可以像使用Interface Builder或以编程方式创建常规按钮一样创建一个按钮。
只需将按钮类型更改为NSToggleButton
。
然后给按钮一个替代的标题和图像以及一个常规的标题和图像。
按钮首先显示常规的标题和图像,然后在用户单击后显示替代的标题和图像。
五、使用复选框
复选框显示应用程序中某些内容的设置。
复选框的另一个名称是开关按钮。
复选框用一行文本标识为正方形。
您可以使用NSButton
属性state
来设置复选框的状态。
可能的状态是NSOnState
、NSOffState
和NSMixedState
。
如果按钮关闭,则框为空。
如果按钮打开,则框中有一个复选标记。
如果按钮处于混合状态,则框中有一个破折号。
1、标准复选框
在Interface Builder中创建复选框是最简单的。
您也可以通过创建具有NSSwitchButton
类型的NSButton
实例以编程方式创建复选框。
与一组单选按钮不同,一组复选框中可以打开多个项目。
这组按钮显示所有选定的字符都是粗体,没有一个是斜体字,有些是下划线:
2、图标复选框
您还可以有一个复选框,它是一个图标按钮;也就是说,它主要由它的图标标识,很少或没有文本。
如果按钮关闭,它看起来像是伸出来的。
如果按钮打开,它看起来像是被按进去的。
(图标按钮不能显示混合状态。)
您可以在Interface Builder或以编程方式创建图标复选框。
如果您使用Interface Builder,请从按钮开始。
如果您以编程方式创建它,请创建一个NSButton
实例。
然后通过将其类型设置为NSPushOnPushOffButton
、图像位置设置为NSImageOnly
、边框类型设置为方形边框类型来更改它。
然后将图像设置为您想要的。
五、使用单选按钮
单选按钮显示应用程序中的某些设置,并且是一次只能打开一个按钮的组的一部分。
使用一组单选按钮在几个互斥的选项中进行选择。
1、标准单选按钮
标准的单选按钮是一个小圆圈,后面跟着一行文字。
如果按钮关闭,圆圈是空的。
如果按钮打开,圆圈被填满。
如果按钮处于混合状态,圆圈中有一个破折号。
例如,这组按钮显示所有选定的对象都是绿色的:
这个组显示一些选定的对象是红色的,一些是绿色的:
一组单选按钮使用包含多个NSButtonCell
实例并具有NSRadioModeMatrix
跟踪模式的NSMatrix
对象实现。
每当单击矩阵的一个按钮时,矩阵都会关闭先前选择的按钮并打开新单击的按钮。
在Interface Builder中创建一组开关按钮是最简单的。
您也可以通过分配一个NSMatrix
对象并使用原型单元和NSRadioModeMatrix
的跟踪模式对其进行初始化(调用initWithFrame:mode:prototype:numberOfRows:numberOfColumns:
)来以编程方式创建一个NSButtonCell
对象,其类型为NSRadioButton
。
清单1说明了如何做到这一点。
清单1以编程方式创建单选按钮矩阵
- (void)awakeFromNib {
NSButtonCell *prototype = [[NSButtonCell alloc] init];
[prototype setTitle:@"Watermelons"];
[prototype setButtonType:NSRadioButton];
NSRect matrixRect = NSMakeRect(20.0, 20.0, 125.0, 125.0);
NSMatrix *myMatrix = [[NSMatrix alloc] initWithFrame:matrixRect
mode:NSRadioModeMatrix
prototype:(NSCell *)prototype
numberOfRows:3
numberOfColumns:1];
[[[typeField window] contentView] addSubview:myMatrix];
NSArray *cellArray = [myMatrix cells];
[[cellArray objectAtIndex:0] setTitle:@"Apples"];
[[cellArray objectAtIndex:1] setTitle:@"Oranges"];
[[cellArray objectAtIndex:2] setTitle:@"Pears"];
[prototype release];
[myMatrix release];
}
图标单选按钮
您也可以有一个图标按钮的单选按钮;也就是说,一个主要由其图标标识的按钮,很少或没有文本。
如果按钮关闭,它看起来像是卡住了。
如果按钮打开,它看起来像是被按下了。
(图标按钮不能显示混合状态。)
您可以在Interface Builder或以编程方式创建一组图标单选按钮。
如果您使用Interface Builder,请从按钮矩阵开始。
如果您以编程方式创建它,请创建按钮矩阵。
然后将矩阵的跟踪模式更改为NSRadioModeMatrix
。
将按钮的类型更改为NSPushOnPushOffButton
,将其图像位置更改为NSImageOnly
,将其边框类型更改为方形边框类型。
最后将其图像设置为您想要的。
六、查询按钮矩阵
一组单选按钮或复选框在编程上是一个NSMatrix
对象,其组成对象是NSButtonCell
对象。
Matrix对象是一种特殊的控件。
它的每个单元格都可以指定自己的目标对象和动作选择器。
此外,NSMatrix
可能有自己的目标和动作选择器。
(有关与矩阵对象相关的目标-动作的更多信息,请参阅 矩阵编程指南 。)
要找出用户选择了哪个单选按钮或复选框——在他们单击它的时候——您可以为矩阵中的每个单元格指定一个目标和不同的操作选择器,然后实现相应的操作方法。
然而,在单选按钮或复选框的矩阵中查询当前选择的更有效方法是为NSMatrix
对象本身实现目标操作,并在操作方法中确定现在选择了哪个单元格(或多个单元格)。
NSMatrix
的方法是selectedCell
和selectedCells
。
清单1显示了一个操作方法的实现,该方法响应单选按钮矩阵中的选择。
清单1查询选定单元格的矩阵对象
- (IBAction)findSelectedButton:(id)sender { // sender is NSMatrix object
NSButtonCell *selCell = [sender selectedCell];
NSLog(@"Selected cell is %d", [selCell tag]);
}
此代码片段说明了在处理矩阵中单元格的选择时可以应用的另一种技术。
您可以为矩阵中的每个单元格分配数字标签以识别它,然后在处理选择时查询这些标签值。
七、设置按钮边框的外观
您可以通过改变按钮的形状和底纹来控制按钮的边框。
请注意,如果isBordered
返回NO
,则不会显示边框。
使用setBordered:
更改其值。
要更改边框的形状,请使用setBezelStyle更改按钮的setBezelStyle:
边框类型有两大类。
- 如果您的按钮主要由文本标识,请使用
NSRoundedBezelStyle
。
它为文本按钮使用适当的边框样式,即圆角矩形,如下所示:
- 如果您的按钮主要由图标标识,请使用
NSRegularSquareBezelStyle
、NSThickSquareBezelStyle
或NSThickerSquareBezelStyle
。
这些类型使用带边框的矩形按钮。
小样式有2像素边框;中等样式,3像素;大样式,4像素。
三种类型如下所示:
八、设置按钮的标题
一个按钮可以有两个标题:正常和备用。
如果按钮类型是NSMomentaryPushInButton
、NSPushOnPushOffButton
、NSMomentaryLightButton
或NSOnOffButton
,则只显示正常标题。
如果按钮类型是NSMomentaryChangeButton
或NSToggleButton
,则在按钮状态关闭时显示正常标题(NSOffState
),而在按钮状态打开或混合时显示备用标题(NSOnState
.或NSMixedState
)。
如果您希望按钮显示所有三种状态的不同标题,则必须子类化NSButton
。
如果您希望标题包含纯文本,请使用setTitle:
设置普通标题,setAlternateTitle:
设置备用标题。
如果您希望标题包含样式文本(例如,斜体或粗体),请使用setAttributedTitle:
和setAttributedAlternateTitle:
。
要设置标题相对于按钮图像的位置,请使用setImagePosition:
,设置按钮的图像中描述。
如果没有图像,则标题在按钮内水平和垂直居中。
如果标题在图像的上方、下方或重叠,则标题在按钮内水平居中。
要隐藏标题,请使用setImagePosition:
,参数为NSImageOnly
。
要设置标题的字体,请将setFont:
发送到按钮的按钮单元格。
如果您希望按钮在鼠标悬停时在标签中显示其标题,则需要使用工具提示。
九、设置按钮的图像
一个按钮可以有两个与之关联的图像:正常图像和备用图像。
如果按钮类型是NSMomentaryPushInButton
、NSPushOnPushOffButton
、NSMomentaryLightButton
、或NSOnOffButton
,则只显示正常图像。
如果按钮类型是NSMomentaryChangeButton
或NSToggleButton
,则在按钮状态关闭时显示正常图像(NSOffState
),而在按钮状态打开或混合时显示备用图像(NSOnState
.或NSMixedState
)。
如果您希望按钮显示所有三种状态的不同图像,则必须子类化NSButton
.(尽管开关和单选按钮可以显示所有三种状态的不同图像,但此功能没有公共界面。)
要设置普通图像,请使用setImage:
。
要设置备用图像,请使用setAlternateImage:
。
**注意:**如果按钮是复选框或单选按钮,不要更改其图像。
这些按钮的图像是系统定义的,更改它们可能会导致不可预测的结果。
如果您想要具有自定义外观的开关或单选按钮,请自定义切换按钮(类型为NSToggleButton
的按钮)或子类NSButton
。
要设置按钮图像的位置,请使用setImagePosition:
,下面有以下值之一。
默认值是NSNoImage
NSNoImage ![]() | NSImageOnly ![]() | NSImageOverlaps ![]() |
---|---|---|
NSImageLeft ![]() | NSImageRight ![]() | |
NSImageBelow ![]() | NSImageAbove ![]() |
十、隐藏按钮
有两种方法可以从视图中隐藏按钮:它可以是完全透明的,也可以仅在鼠标悬停时显示其边框。
- 要使按钮透明,请使用
setTransparent:
。
透明按钮跟踪鼠标并发送其动作,但不绘制自身。
这对于敏感屏幕上的区域非常有用,以便当该区域接收到鼠标单击时,将动作发送到目标。 - 要让按钮仅在处于活动状态且鼠标在其上方时才显示其边框,请使用
setShowsBorderOnlyWhileMouseInside:
。
按钮的其余组件始终被绘制。
下面是一些按钮的示例,这些按钮仅在鼠标在其上方时才显示其边框:
十一、将按钮设为默认按钮
如果按钮具有NSRoundedBezelStyle
边框类型,您可以将其标记为默认按钮。
默认按钮脉冲,当用户按下返回时调用其操作消息。
它看起来像这样:
要将按钮标记为默认值,请将其键等效为setKeyEquivalent:
,如下所示:
[myButton setKeyEquivalent:@"\r"];
您还可以在Interface Builder中设置按钮的等效键,如设置按钮的等效键中所述。
默认按钮周围有一个粗粗的轮廓,在按钮的边框之外;您的界面设计应该考虑到额外的空间。
十二、设置按钮的等效键
按钮可以有一个等效的键,因此当用户按下该键时,按钮会像被单击一样做出响应。
请注意,如果您将键设置为相当于返回,则该按钮将成为默认按钮。
您通常在Interface Builder中设置按钮的等效键。
为此,请选择该按钮并打开检查器的属性窗格。
公开按钮的属性,单击Key Equiv.字段,然后键入要与按钮关联的键或组合键。
(按清除可删除等效键。)
若要以编程方式设置等效键,请使用带有字符的setKeyEquivalent:
。
例如,要将其设置为返回,请使用:
[myButton setKeyEquivalent:@"\r"];
要将按钮的键等效于非打印字符,可以使用NSResponder
定义的键常量,如下例所示,该示例将按钮的键等效于左箭头键。
unichar arrowKey = NSLeftArrowFunctionKey;
[button setKeyEquivalent:[NSString stringWithCharacters:&arrowKey length:1]];
十三、子类化NSButton
如果创建的NSButton子类执行自己的初始化,则覆盖指定的初始化程序(NSView的initWithFrame:
方法)。
如果要将自定义NSButtonCell子类与NSButton子类一起使用,则必须覆盖cellClass:
方法,如子类NSControl中所述。
2024-06-16(日)