根据另一个 NSbutton 以编程方式设置 NSButton 属性
Programmatically set NSButton attributes according to another NSbutton
我有一个 viewController xib 文件,我在其中设计了一个具有以下特征的按钮(取自 xib 文件)
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HKv-Bv-6j3">
<rect key="frame" x="126" y="9" width="250" height="32"/>
<buttonCell key="cell" type="push" title="Disable" bezelStyle="rounded" alignment="center"
borderStyle="border" imageScaling="proportionallyDown" inset="2" id="YYS-ZL-U1e">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
现在我希望以编程方式添加任意数量的相似设计按钮。如何将上面的 XML 转换为 objective-c 代码。
“在黑暗中摸索”方法
XML 标签都与 NSButton
上的属性或方法相关。有些是自定义设置,例如 frame
。其他的是默认值(比如使用系统字体),在这种情况下您不必显式设置它们。请注意,还有一些不同的对象 - NSButtonCell
是此组合的一部分(buttonCell
XML 对象)。您不需要单独实例化它,但您可以在其中找到一些属性。你会做这样的事情:
frame = NSMakeRect(126, 9, 250, 32); // x, y, width height
myButton = [[NSButton alloc] initWithFrame:frame];
myButton.translatesAutoresizingMaskIntoConstraints = NO;
myButton.title = @"Disable";
myButton.bezelStyle = NSBezelStyleRounded;
myButton.alignment = NSTextAlignmentCenter;
myButton.imageScaling = NSImageScaleProportionallyDown; // default value
...
这不是完整的复制品,但您应该明白了。请注意,其中一些属性是在 NSButton
中定义的,但其他属性(如 alignment
)是在超类中定义的,例如NSControl
.
Cocoa 方式
这是一种方法。一个更 "Cocoa" 的解决方案是使用一个按钮创建一个 XIB 文件并根据您的喜好对其进行配置。然后当你想要它的副本时,加载 XIB 并获取它:
NSButton *myButton;
NSArray *topLevelObjects;
[[NSBundle mainBundle] loadNibNamed:@"MyCustomButton"
owner:self
topLevelObjects:&topLevelObjects];
for (id a in topLevelObjects) {
if ([a isKindOfClass:NSView.class]) {
myButton = a;
break;
}
}
如果只在 XIB 中放置一个按钮,则不需要专用控制器。上面的代码加载 XIB,然后获取它找到的第一个 NSView
,这是你的按钮。与上面的方法相比,我更喜欢这种方法,因为 a) 您不必将 XML 解码为一系列代码语句,b) 您可以随时在 Interface Builder 中更改按钮的属性,以及 c ) 一旦你加载了按钮,你就可以复制它了。
我有一个 viewController xib 文件,我在其中设计了一个具有以下特征的按钮(取自 xib 文件)
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HKv-Bv-6j3">
<rect key="frame" x="126" y="9" width="250" height="32"/>
<buttonCell key="cell" type="push" title="Disable" bezelStyle="rounded" alignment="center"
borderStyle="border" imageScaling="proportionallyDown" inset="2" id="YYS-ZL-U1e">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
现在我希望以编程方式添加任意数量的相似设计按钮。如何将上面的 XML 转换为 objective-c 代码。
“在黑暗中摸索”方法
XML 标签都与 NSButton
上的属性或方法相关。有些是自定义设置,例如 frame
。其他的是默认值(比如使用系统字体),在这种情况下您不必显式设置它们。请注意,还有一些不同的对象 - NSButtonCell
是此组合的一部分(buttonCell
XML 对象)。您不需要单独实例化它,但您可以在其中找到一些属性。你会做这样的事情:
frame = NSMakeRect(126, 9, 250, 32); // x, y, width height
myButton = [[NSButton alloc] initWithFrame:frame];
myButton.translatesAutoresizingMaskIntoConstraints = NO;
myButton.title = @"Disable";
myButton.bezelStyle = NSBezelStyleRounded;
myButton.alignment = NSTextAlignmentCenter;
myButton.imageScaling = NSImageScaleProportionallyDown; // default value
...
这不是完整的复制品,但您应该明白了。请注意,其中一些属性是在 NSButton
中定义的,但其他属性(如 alignment
)是在超类中定义的,例如NSControl
.
Cocoa 方式
这是一种方法。一个更 "Cocoa" 的解决方案是使用一个按钮创建一个 XIB 文件并根据您的喜好对其进行配置。然后当你想要它的副本时,加载 XIB 并获取它:
NSButton *myButton;
NSArray *topLevelObjects;
[[NSBundle mainBundle] loadNibNamed:@"MyCustomButton"
owner:self
topLevelObjects:&topLevelObjects];
for (id a in topLevelObjects) {
if ([a isKindOfClass:NSView.class]) {
myButton = a;
break;
}
}
如果只在 XIB 中放置一个按钮,则不需要专用控制器。上面的代码加载 XIB,然后获取它找到的第一个 NSView
,这是你的按钮。与上面的方法相比,我更喜欢这种方法,因为 a) 您不必将 XML 解码为一系列代码语句,b) 您可以随时在 Interface Builder 中更改按钮的属性,以及 c ) 一旦你加载了按钮,你就可以复制它了。