0

对于个人项目,我目前正在尝试在 Automator for OS X 中复制工具栏的视觉样式。我已经尝试了几乎所有方法来让 NSToolbar 中的 NSButtons 在视觉上看起来相似,但似乎无法想象找出精致的 UI 组件来解决这个问题,所以我转向 Stack Overflow 上的聪明才智。

我正在尝试做的事情:我正在尝试复制 Automator 工具栏按钮的视觉样式:

在此处输入图像描述

设置:目前我有活动按钮状态、非活动按钮状态和按下按钮状态的 tiff 图像。我想使用这些图像作为 NSButtonCell 的背景。现在,我将 NSButtonCell 子类化(代码如下),并在 Interface Builder 的 XIB 文件中将 NSButtonCell 类设置为 TFToolbarButtonCell。在 NSButtonCell 的子类中,我重写了 -drawWithFrame:inView 以在框架中绘制适当的状态图像;我还覆盖 -highlight:withFrame:inView 以在单击按钮时绘制按下的图像。

非常感谢我在这里可能做错的任何方向!

TFToolbarButtonCell.h

#import <Cocoa/Cocoa.h>

@interface TFToolbarButtonCell : NSButtonCell

    @property (nonatomic, strong) NSImage *onImage;
    @property (nonatomic, strong) NSImage *offImage;
    @property (nonatomic, strong) NSImage *highlightImage;

@end

TFToolbarButtonCell.m

#import "TFToolbarButtonCell.h"

@implementation TFToolbarButtonCell

    - (id)init
    {
        self = [super init];
        if(self) {
            //initialize here
        }
        return self;
    }

    - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    {
        if([self state]){
            [self.onImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
        } else {
            [self.offImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
        }
    }

   - (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView
    {
        if(flag){
            [self.highlightImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
        }
    }

@end
4

1 回答 1

0

我认为你可以通过继承 NSButton 和实现来完成你想要的

- (void)mouseDown:(NSEvent *)theEvent
- (void)mouseUp:(NSEvent *)theEvent

以及您自己设置非活动状态的方法。

这些方法会调用

- (void)setImage:(NSImage *)anImage

使用不同的图像从活动状态变为按下状态再到非活动状态。

您还必须在您的 NSButton 上取消选中 Interface Builder 中的“Bordered”以停止显示按钮背景。

还有,打电话

- (void)setEnabled:(BOOL)enabled

NSToolbarItem 上的将调色板标签更改为活动/非活动(灰色按钮下方的文本)。

于 2013-04-11T22:27:56.940 回答