在 cocoa 中以编程方式更改按钮的背景图像

Change a button's background image programmatically in cocoa

我搜索过的所有主题在 Obj-c 中都已过时或不完整。

我需要学习如何在 InterfaceBuilder 中有实际按钮时以编程方式更改按钮的背景图像。 (这听起来很奇怪,但我 NSCollectionView 需要它,因为我有许多具有不同背景图像的类似按钮)。

在界面生成器中,我将一个按钮拖到我的视图上 window,之后我应该做什么?

我了解到:

我一直在为此苦苦挣扎。

那么您是否将按钮连接到 IBOutlet 属性?如果是这样,那么您需要做的就是使用 [button setImage:]

如果您还没有这样做,请确保您要从中更改图像的对象实例在界面生成器中,即已作为那些蓝框之一被放入。然后,如果您设置对象的 class 并在头文件中有一个 IBOutlet 属性,您只需将出口选项卡中的按钮出口(看起来像箭头)拖动到实际按钮本身即可 link 两个

编辑:看来您在使用按钮的实际连接部分时遇到了问题?您的 IB 文件很可能看起来像这样:

在左侧列表中查找对象部分。这些是代码中可以将按钮连接到的实际对象。您可能会在那里看到一个应用程序委托对象,它包含在您首次创建项目时生成的默认 IB 文件中。如果你想在你的 app delegate 中处理图像变化,那么只需将这个 属性 添加到你的 AppDelegate.h 文件中以创建一个出口:

@property IBOutlet NSButton *button;

如果您返回到界面构建器和 select 应用委托对象,您可以在 outlet 选项卡下看到刚刚创建的 outlet:

将小圆圈拖到按钮上进行连接,这应该是最简单的一点。

但我假设您想从应用委托以外的其他地方调用它,为此我们需要做更多的解释。如果你想从中调用它的 class 是 NSView 的子 class 并且 已经在你的界面构建器 中,你可以将该行添加到你的视图中头文件,它将出现在视图的出口选项卡下。

如果你想从另一个不是视图等的对象调用它,你需要执行以下两个选项之一:

  1. 在界面生成器中创建对象实例。这意味着您必须实际将对象拖入界面构建器,而不是通常使用 alloc] init]; 等创建。这会大大改变对象的结构,因为您将无法再随意创建它,因为它会在您加载 .nib 文件时自动实例化。另外需要注意的是,您的 init 函数将不再被调用,您需要使用 awakeFromNib 来代替。如果您确实选择沿着这条路线走,只需拖动一个对象即可:

将你的 outlet 属性 添加到头文件中:

设置对象的class:

并连接插座:

  1. 如果加载对象 XIB 不是你的事,你总是可以将 属性 插座连接到你的应用程序 delegate/view 控制器并从那里访问它。如果这是您遇到的问题,希望这能解决问题。

对于iOS:

不需要创建 NSButton 子类。

你只需要在 Storyboard 上添加按钮,为你的按钮设置 IBOutlet 属性(ctr+从你的按钮拖动到你的视图控制器),并设置背景图像:

[myButton setBackgroundImage:[UIImage imageNamed:@"ImageName"] forState:UIControlStateNormal]

对于 MacOS:

你可以使用

setImage:

Apple Doc 所述,并更改其 size/position

(抱歉我的英语不好)

当然正如 Duukee 所说,我认为不需要手动创建任何 NSButton 或 UIButton 实例当我们在 Interface Builder 中有一个对象时,我们可以按如下方式使用它的出口,

UIImage* Desired_Image=[UIImage imageNamed:@"yourimage.png"];
[My_Button setimage:Desired_Image forState:UIcontrolstateNormal];

HTH!快乐编码:)