Button简介

Button是一个用户界面对象,在单击时向目标发送操作消息。

本文介绍Cocoa提供的各种按钮的不同之处以及如何使用它们。

Button是如何工作的

Button遵循target-action设计模式,它是一个用户界面对象,在单击时向目标发送操作消息。关于此设计模式的更多信息,请查看 Concepts in Objective-C Programming中的Target-Action

大多数按钮的工作是由NSButtonCell处理的,一旦NSButtonCell的视图被点击并捕获到鼠标按下的事件后,NSButtonCell的实例发送它的动作消息给目标对象,但是只要鼠标光标在Button cell内部并保持按下状态也可以持续发送动作消息。Button cell的按压状态可以通过多种高亮方式显示。比如,有边框的按钮单元格可以出现在屏幕上,或者在按下按钮单元格时,图像或标题可以更改为另一种形式。

NSButtonCell对象必须使用NSControl子类的实例,如果你需要一个按钮,如push按钮,使用包含单个NSButtonCell实例的NSButton对象;如果需要一组相关的按钮,例如一组开关或radio按钮,则使用包含几个NSButtonCell实例的NSMatrix对象。

NSButtonNSMatrix都提供了一个控制视图,然而,虽然NSMatrix要求您直接访问NSButtonCell对象,但是NSButton的大多数方法对于NSButtonCell中相同声明的方法是“隐藏”的,(也就是说,NSButton方法的执行会自动为你调用相应的NSButtonCell方法,无需关心NSButtonCell的存在。)唯一没有覆盖的NSButtonCell方法与用于显示快捷键的字体以及高亮或显示NSButton状态的特定方法有关(最后这些通常与NSButtonsetButtonType:方法一起设置)。

Button的类型

Button的类型决定了它的行为,当按压时如何高亮显示以及是否显示其状态,button的类型可以归纳为三类:

  • 普通按钮
  • 粘性按钮
  • 单选按钮及复选框

通过setButtonType设置按钮类型。

普通按钮

这些按钮主要用于触发动作,因为他们不显示自己的状态。这类按钮在鼠标按下时改变他们的显示并且在鼠标抬起时返回他们原始的状态。

  • 要让NSButton控制按钮被按下的外观,使用NSMomentaryPushInButton(在Xib的按钮inspector中称为“Mementary Push”),当鼠标按下按钮时,按钮似乎是按进去的。

    这里有一个NSMomentaryPushInButton按钮的例子,带有NSRoundedBezelStyle风格的边框,在正常和按下时的外观:

    这是一个带有NSThickerSquareBezelStyle样式的NSMomentaryPushInButton按钮的例子。边框样式NSRegularSquareBezelStyleNSThickSquareBezelStyle类似。

  • 为了自己控制按钮的外观,使用NSMomentaryChangeButton(在Xib中称为“Momentary Change”)。当鼠标按钮按下时,它将显示为替换图片和标题,当鼠标释放后,它将显示为正常的图片和标题。如果没有设置替换图片或者按钮标题,它的外观不会有任何变换。

粘性按钮

此类按钮显示他们的状态,并且在按下后似乎会粘住。点击一次后,它将会保持按下状态直到下一次点击。

  • 要让NSButton控制按钮被按下的外观,使用NSPushOnPushOffButton(xib中称为“Push On/Push Off”)。按钮被按下后,按钮似乎是按进去的,再次点击后按钮弹起。弹出的外观用于关闭状态(NSOffState),而压入的外观用于打开状态和混合状态(NSOnStateNSMixedState)。这对于显示应用程序中某些内容的状态的按钮(例如,显示所选文本是否为黑体的按钮)非常有用。
  • 要控制按下按钮的外观,请使用NSToggleButton(在Interface Builder的按钮检查器中称为“切换”)。单击一次后,按钮会显示它的替代图像和标题。再次单击后,按钮会显示其正常的图像和标题。如果没有替代的图像或标题,按钮的外观不会改变。正常的图像和标题表示off状态(NSOffState),备用的图像和标题表示on状态和混合状态(NSOnState和NSMixedState)。这对于在两个动作(例如,停止和开始)之间切换的按钮非常有用。

如果想要一个按钮显示所有三种状态的不同外观,必须自定义NSButton。

单选按钮及复选框

这些按钮显示应用程序中的状态,它们是NSToggleButton的特殊版本,具有系统定义的图片。

  • 要在两个选项中进行选择,请使用 NSSwitchButton按钮,它看起来像一个复选框。这种类型的按钮可以在Interface Builder中作为单独的选项板使用。
  • 要在两个以上的选项中进行选择,请使用NSRadioButton按钮矩阵。矩阵和单选按钮一起工作,以确保每次只打开一个按钮。这种类型的按钮可以在Interface Builder中作为单独的选项板项使用。
    这里写图片描述
    更改这些按钮使用的图像可能会导致不可预测的结果,如果想要一个具有定制外观的开关按钮或单选按钮,可以定制一个切换按钮或自定义NSButton

虽然复选框和单选按钮可以显示所有三种状态的不同图像,但其他类型的按钮却不能。

普通按钮的使用

普通按钮执行按钮名所描述的动作,通常,它是一个圆角矩形,里面包含了它的名字。例如,这个按钮可能出现在一个对话框中,该对话框可以找到文档中的文本。
这里写图片描述
Interface Builder中创建按钮是最简单的。您还可以通过编程方式创建一个NSButton实例,其类型为NSMomentaryPushInButtonNSNoImage的图像位置和NSRoundedBezelStyle的边框。

此类按钮也可以是一个图标按钮,也就是说,这个按钮主要由其图标识别,很少或没有文本。它是长方形的,像这样:
这里写图片描述
您可以使用Interface Builder或代码方式创建图标按钮。如果使用的是Interface Builder,从一个普通的按钮开始。如果您以代码方式创建它,那么创建一个NSButton实例,然后将其类型设置为NSMomentaryPushInButton,其图像位置设置为NSImageOnly,其边框类型设置为正方形边框类型。最后,设置图像为您想要的。

注意:文本按钮上可以有一个小图像,图标按钮可以有一个标签。最重要的问题是什么最突出。如果是文本,将其视为文本按钮。如果是图像,将其视为图标按钮。

您还可以有一个在两个状态之间切换的按钮,每个状态都有自己的标题和图像。例如,一个按钮可以在开始和停止之间切换。您可以和使用Interface Builder或代码创建普通按钮相同的方式创建一个按钮,只需将按钮类型更改为NSToggleButton。然后给按钮一个可选标题和图像以及一个常规标题和图像。该按钮首先显示常规标题和图像,然后在用户单击后显示替换的标题和图像。

使用复选框

一个复选框展示应用中的设置,复选框的另一个名字叫开关按钮,用一行文本标识一个复选框。

使用NSButton的state属性去设置一个复选框的状态。可能的状态为NSOnState、NSOffState和NSMixedState。如果按钮是关闭的,则框是空的,反之,该框里面有个对号;如果按钮是混合状态,则框里有一个破折号。

标准复选框

Interface Builder是创建复选框最简单的方式。你也可以使用代码创建,继承自NSButton,其类型定义为NSSwitchButton

不同于一组单选按钮,复选框中可以选择多个选项。这组按钮显示所有选中的字符都是粗体,没有斜体,还有一些是下划线:
这里写图片描述

图标复选框

你也可以有一个复选框,它是一个图标按钮;也就是说,这是一个主要由其图标识别,很少或没有文本,如果按钮是关闭的,它似乎是突出的;如果按钮是开着的,它似乎是按进去的。(图片按钮不能显示混合状态。)

您可以在Interface Builder或代码中创建图片复选框,如果您使用的是Interface Builder,在普通按钮的基础上设置;如果以代码方式创建,则需要创建NSButton的实例。然后通过将其类型设置为NSPushOnPushOffButton、图像位置设置为NSImageOnly、边框类型设置为正方形类型来更改它,然后设置图像为你想要的即可。

单选按钮

单选按钮显示应用程序中某些内容的设置,并且是一个组的一部分,其中一次只能有一个按钮是开启的,使用一组单选按钮在几个相互排斥的选项中进行选择。

标准单选按钮

标准的单选按钮是一个小圆圈,后面跟着一行文本。如果按钮关闭,圆圈是空的;如果按钮是打开的,圆圈被填充;如果按钮是混合状态,圆圈有一个破折号。
例如,这组按钮显示所有选中的对象都是绿色的:
这里写图片描述
这个组显示部分选中的对象是红色的,部分是绿色的:
这里写图片描述
一组单选按钮由一个NSMatrix对象实现,该对象包含几个NSButtonCell实例,并具有NSRadioModeMatrix的跟踪模式。每当单击矩阵的某个按钮时,矩阵就会关闭先前选择的按钮并打开新单击的按钮。
Interface Builder中创建一组开关按钮是最容易的。您还可以通过代码的方式创建一个NSMatrix对象并初始化它(在调用initWithFrame:mode:prototype:numberOfRows:numberOfColumns:),使用原型单元格和NSRadioModeMatrix的跟踪模式。对于原型对象,使用NSRadioButton类型创建一个NSButtonCell对象。清单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];
    [[[self window] contentView] addSubview:myMatrix];

    NSArray *cellArray = [myMatrix cells];
    [[cellArray objectAtIndex:0] setTitle:@"Apples"];
    [[cellArray objectAtIndex:1] setTitle:@"Oranges"];
    [[cellArray objectAtIndex:2] setTitle:@"Pears"];
}

图标单选按钮

单选按钮也可以是一个图标按钮;也就是说,这是一个主要由其图标识别,很少或没有文本。如果按钮是关闭状态的,那么它似乎是卡在里面的;如果按钮是开着的,它似乎是按进去的。(图标按钮不能显示混合状态。)
您可以在Interface Builder或代码方式中创建一组图标单选按钮。如果您使用的是Interface Builder请从一个普通按钮开始;如果以代码方式创建,则创建一个按钮矩阵。然后将矩阵的跟踪模式改为NSRadioModeMatrix。将按钮的类型更改为NSPushOnPushOffButton,它们的图像位置更改为NSImageOnly,它们的边框类型更改为正方形边框类型。最后设置他们的图片为你想要的。

查询按钮矩阵

一组单选按钮或复选框以编程方式是一个NSMatrix对象,其组成对象是NSButtonCell对象。矩阵对象是一种特殊的控件。每个单元格都可以指定自己的目标对象和操作选择器。另外,NSMatrix可能有自己的目标和操作选择器。(有关矩阵对象的目标操作的更多信息,请参阅矩阵编程指南。)
要找到用户选择的单选按钮或复选框(在用户单击时),可以为矩阵中的每个单元格指定目标和不同的操作选择器,然后实现相应的操作方法。然而,在单选按钮或复选框矩阵中查询当前选择的更有效的方法是为NSMatrix对象本身实现目标操作,并且在操作方法中确定现在选择了哪个单元(或单元)。这个的NSMatrix方法是selectedCellselectedCells
清单1展示了一个action方法的实现,该方法响应单选按钮矩阵中的选择。
清单1 查询所选的radio-button单元格的矩阵对象

 - (IBAction)findSelectedButton:(id)sender { // sender是一个矩阵对象
    NSButtonCell *selCell = [sender selectedCell];
    NSLog(@"Selected cell is %d", [selCell tag]);
}

这个代码片段说明了在处理矩阵中的单元格选择时可以应用的另一种技术。可以为矩阵中的每个单元格分配数字标记来识别它,然后在处理选择时查询这些标记值。

设置按钮边框的外观

可以通过改变按钮的形状和阴影来控制它的边框。注意,如果isborder返回NO,则边界不会出现。使用setborder:改变它的值。
要更改边框的形状,请使用setBezelStyle:改变按钮的边框类型。有两大类边框类型。

  • 如果您的按钮主要通过文本标识,那么使用NSRoundedBezelStyle。它为文本按钮使用适当的边框样式,它是一个圆角矩形,如下所示:
    这里写图片描述
  • 如果您的按钮主要由图标标识,那么使用NSRegularSquareBezelStyle, NSThickSquareBezelStyleNSThickerSquareBezelStyle。这些类型使用带有边框的矩形按钮。小样式具有2像素的边框;中等样式有3像素的边框;大样式有4像素的边框。三种类型如下所示:
    这里写图片描述

设置按钮标题

一个按钮可以有两个与之相关的标题:普通标题和交替标题。如果按钮类型是NSMomentaryPushInButtonNSPushOnPushOff按钮、NSMomentaryLightButtonNSOnOffButton,则只显示正常的标题。如果按钮类型是NSMomentaryChangeButtonNSToggleButton,则当按钮的状态为off (NSOffState)时将显示正常标题,当按钮的状态为onmixed (NSOnState)时将显示备用标题。或NSMixedState)。如果你想要一个按钮显示所有三种状态的不同标题,你必须子类化NSButton
如果希望标题包含纯文本,请使用setTitle:设置普通标题和setAlternateTitle:设置备用标题。如果希望标题包含样式文本(例如,斜体或粗体),请使用setAttributedTitle:setAttributedAlternateTitle:
要设置标题相对于按钮图像的定位方式,使用setImagePosition:,在设置按钮图像中描述。如果没有图片,标题将在按钮内水平和垂直居中。如果标题位于图像的上方、下方或重叠部分,则标题将在按钮内水平居中。要隐藏标题,使用setImagePosition:带有NSImageOnly的参数。
要设置标题的字体,发送setFont:到按钮的按钮单元格。
如果想让按钮在鼠标移动到标签上时显示其标题,需要使用Tool Tips

设置按钮图标

一个按钮可以有两个与之相关联的图像:普通图像和交替图像。如果按钮类型是NSMomentaryPushInButtonNSPushOnPushOff按钮、NSMomentaryLightButtonNSOnOffButton,则只显示正常的图像。如果按钮类型为NSMomentaryChangeButtonNSToggleButton,则正常图像在按钮状态为off时显示(NSOffState),而备用图像在按钮状态为onmixed (NSOnState)时显示。或NSMixedState)。如果你想要一个按钮显示所有三种状态的不同图像,你必须子类化NSButton。(尽管开关按钮和单选按钮可以显示所有三种状态的不同图像,但这个功能没有公共接口。)
要设置正常的图像,使用setImage:。要设置备用映像,使用setAlternateImage:

注意:如果按钮是复选框或单选按钮,不要改变其图像。这些按钮的图像是系统定义的,更改它们可能导致不可预知的结果。如果您想要一个具有定制外观的开关按钮或单选按钮,可以定制一个切换按钮(类型为NSToggleButton的按钮)或NSButton子类。
要为按钮的图像设置位置,使用setImagePosition:,下面的值之一。默认是NSNoImage

NSNoImage这里写图片描述NSImageOnly这里写图片描述NSImageOverlaps这里写图片描述
NSImageLeft这里写图片描述NSImageRight这里写图片描述
NSImageBelow这里写图片描述NSImageAbove这里写图片描述

隐藏按钮

有两种方法可以从视图中隐藏按钮:它可以是完全透明的,也可以只在鼠标经过它时才显示它的边框。

  • 要使按钮透明,使用setTransparent:。一个透明的按钮跟踪鼠标并发送它的动作,但不绘制自己。这对于将屏幕上的区域敏感化非常有用,这样当该区域收到鼠标单击时,操作就会发送到目标。
  • 要让一个按钮显示其边框,只有当它处于活动状态并且鼠标在它上面时,才可以使用setshowsborderonly目地:。其余的按钮的组件总是绘制。下面是一些按钮的例子,这些按钮只在鼠标移动到它们上面时才显示它们的边框:
    这里写图片描述

设置按钮为默认样式

如果按钮具有NSRoundedBezelStyle 边框类型,您可以将其标记为默认按钮。默认按钮是选中样式的,当用户按下Return时调用其操作消息。它看起来像这样:
这里写图片描述
若要将按钮标记为默认值,用 setKeyEquivalent:方法将其快捷键设置为Return

[myButton setKeyEquivalent:@"\r"];

可以在Interface Builder中设置快捷键,默认按钮有一个在它周围绘制的粗轮廓,在按钮的边界之外,界面设计应该考虑到额外的空间。

设置按钮快捷键

一个按钮可以有一个等效的键,这样当用户按下那个键时,按钮就会响应,就好像它已经被点击过一样。
注意,如果将按钮的快捷键设置为Return,该按钮将成为默认按钮。
通常在Interface Builder中设置一个按钮的快捷键。为此,选择按钮并打开检查器的attributes窗格。显示按钮的属性,单击键Equiv字段,并键入要与按钮相关联的键或键组合。(按“清除”键可以删除等效键。)

要在程序中设置快捷键,可以使用setKeyEquivalent:并传入相应的字符即可。例如,设置Return为该按钮的快捷键:

[myButton setKeyEquivalent:@"\r"];

要将按钮的键值设置为非打印字符,可以使用NSResponder定义的键常量,如下例所示,它将按钮的键值设置为左箭头键。

unichar arrowKey = NSLeftArrowFunctionKey;
[button setKeyEquivalent:[NSString stringWithCharacters:&arrowKey length:1]];

子类化NSButton

如果创建了一个NSButton的子类来执行它自己的初始化,覆盖指定的初始化器(NSViewinitWithFrame:方法)。如果想在NSButton的子类中使用自定义NSButtonCell子类,必须重写cellClass:方法。

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页