首页 > 其他分享 >Mac开发基础17-NSButton(二)

Mac开发基础17-NSButton(二)

时间:2024-08-06 16:49:24浏览次数:8  
标签:layer target 17 NSButton button Mac 按钮 action

NSButton是一个功能强大且灵活多样的控件,除了基本使用和常见API外,还有一些进阶用法和技巧可以提高按钮的可用性和实现细节。在以下内容中,我会详细介绍一些进阶使用技巧,并封装一个常用的工具类来实现自定义的多种按钮类型。

进阶使用和技巧

1. 自定义按钮的外观和行为

Objective-C

// 自定义按钮的边框颜色和宽度
- (void)customizeButtonAppearance:(NSButton *)button {
    button.wantsLayer = YES;  // 启用 Core Animation
    button.layer.borderColor = [NSColor redColor].CGColor;  // 设置边框颜色
    button.layer.borderWidth = 2.0;  // 设置边框宽度
    button.layer.cornerRadius = 5.0;  // 设置圆角半径
    button.layer.masksToBounds = YES;  // 避免超出的部分显示
}

Swift

// 自定义按钮的边框颜色和宽度
func customizeButtonAppearance(_ button: NSButton) {
    button.wantsLayer = true  // 启用 Core Animation
    if let layer = button.layer {
        layer.borderColor = NSColor.red.cgColor  // 设置边框颜色
        layer.borderWidth = 2.0  // 设置边框宽度
        layer.cornerRadius = 5.0  // 设置圆角半径
        layer.masksToBounds = true  // 避免超出的部分显示
    }
}

2. 控制按钮的按下和松开行为

Objective-C

- (void)addCustomTrackingToButton:(NSButton *)button {
    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:button.bounds
                                                                options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow)
                                                                  owner:self
                                                               userInfo:nil];
    [button addTrackingArea:trackingArea];  // 添加追踪区域,用于鼠标进入和离开时的事件处理
}

- (void)mouseEntered:(NSEvent *)event {
    [self.button setTitle:@"Mouse Entered"];  // 鼠标进入时改变按钮标题
}

- (void)mouseExited:(NSEvent *)event {
    [self.button setTitle:@"Mouse Exited"];  // 鼠标离开时恢复按钮标题
}

Swift

func addCustomTrackingToButton(_ button: NSButton) {
    let trackingArea = NSTrackingArea(rect: button.bounds,
                                      options: [.mouseEnteredAndExited, .activeInKeyWindow],
                                      owner: self,
                                      userInfo: nil)
    button.addTrackingArea(trackingArea)  // 添加追踪区域,用于鼠标进入和离开时的事件处理
}

override func mouseEntered(with event: NSEvent) {
    self.button.title = "Mouse Entered"  // 鼠标进入时改变按钮标题
}

override func mouseExited(with event: NSEvent) {
    self.button.title = "Mouse Exited"  // 鼠标离开时恢复按钮标题
}

3. 自定义按钮图层属性

Objective-C

- (void)setButtonShadow:(NSButton *)button {
    button.wantsLayer = YES;  // 启用 Core Animation
    button.layer.shadowColor = [NSColor blackColor].CGColor;  // 设置阴影颜色
    button.layer.shadowOpacity = 0.5;  // 设置阴影透明度
    button.layer.shadowOffset = CGSizeMake(3, -3);  // 设置阴影偏移
    button.layer.shadowRadius = 10.0;  // 设置阴影半径
}

Swift

func setButtonShadow(_ button: NSButton) {
    button.wantsLayer = true  // 启用 Core Animation
    if let layer = button.layer {
        layer.shadowColor = NSColor.black.cgColor  // 设置阴影颜色
        layer.shadowOpacity = 0.5  // 设置阴影透明度
        layer.shadowOffset = CGSize(width: 3, height: -3)  // 设置阴影偏移
        layer.shadowRadius = 10.0  // 设置阴影半径
    }
}

4. 响应鼠标拖动事件

Objective-C

- (void)trackMouseDragForButton:(NSButton *)button {
    [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskLeftMouseDragged handler:^NSEvent * _Nullable(NSEvent * _Nonnull event) {
        NSPoint location = [event locationInWindow];
        [NSCursor.closedHandCursor push];  // 鼠标拖动时改变光标为闭手
        button.frame = NSMakeRect(location.x - button.frame.size.width / 2, 
                                  location.y - button.frame.size.height / 2, 
                                  button.frame.size.width, 
                                  button.frame.size.height);  // 更新按钮位置
        return event;
    }];
}

Swift

func trackMouseDragForButton(_ button: NSButton) {
    NSEvent.addLocalMonitorForEvents(matching: .leftMouseDragged) { event in
        let location = event.locationInWindow
        NSCursor.closedHand.push()  // 鼠标拖动时改变光标为闭手
        button.frame = NSRect(x: location.x - button.frame.size.width / 2,
                              y: location.y - button.frame.size.height / 2,
                              width: button.frame.size.width,
                              height: button.frame.size.height)  // 更新按钮位置
        return event
    }
}

5. 动画效果

Objective-C

- (void)animateButton:(NSButton *)button {
    // 创建一个基本动画来改变按钮的透明度
    CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnimation.duration = 1.0;  // 动画持续时间
    fadeAnimation.fromValue = @(1.0);  // 起始状态
    fadeAnimation.toValue = @(0.0);  // 结束状态
    fadeAnimation.autoreverses = YES;  // 动画结束后反转
    fadeAnimation.repeatCount = HUGE_VALF;  // 无限循环动画
    
    // 将动画添加到按钮的图层上
    [button.layer addAnimation:fadeAnimation forKey:@"fadeAnimation"];
}

Swift

func animateButton(_ button: NSButton) {
    // 创建一个基本动画来改变按钮的透明度
    let fadeAnimation = CABasicAnimation(keyPath: "opacity")
    fadeAnimation.duration = 1.0  // 动画持续时间
    fadeAnimation.fromValue = 1.0  // 起始状态
    fadeAnimation.toValue = 0.0  // 结束状态
    fadeAnimation.autoreverses = true  // 动画结束后反转
    fadeAnimation.repeatCount = .greatestFiniteMagnitude  // 无限循环动画
    
    // 将动画添加到按钮的图层上
    button.layer?.add(fadeAnimation, forKey: "fadeAnimation")
}

封装工具类

为了方便创建和管理多种类型的按钮,我们可以封装一个工具类。这个工具类可以用于生成不同类型的按钮,并应用各种自定义设置。

Objective-C

#import <Cocoa/Cocoa.h>

@interface NSButtonFactory : NSObject

+ (NSButton *)createCustomButtonWithTitle:(NSString *)title target:(id)target action:(SEL)action;
+ (NSButton *)createImageButtonWithImage:(NSImage *)image target:(id)target action:(SEL)action;

@end

@implementation NSButtonFactory

+ (NSButton *)createCustomButtonWithTitle:(NSString *)title target:(id)target action:(SEL)action {
    NSButton *button = [[NSButton alloc] init];  // 初始化按钮
    [button setTitle:title];  // 设置标题
    [button setTarget:target];  // 设置目标
    [button setAction:action];  // 设置动作方法
    [self applyCustomStyleToButton:button];  // 应用自定义样式
    return button;
}

+ (NSButton *)createImageButtonWithImage:(NSImage *)image target:(id)target action:(SEL)action {
    NSButton *button = [[NSButton alloc] init];  // 初始化按钮
    [button setImage:image];  // 设置按钮图片
    [button setTarget:target];  // 设置目标
    [button setAction:action];  // 设置动作方法
    [self applyCustomStyleToButton:button];  // 应用自定义样式
    return button;
}

+ (void)applyCustomStyleToButton:(NSButton *)button {
    button.wantsLayer = YES;  // 启用 Core Animation
    button.layer.borderColor = [NSColor blueColor].CGColor;  // 设置边框颜色
    button.layer.borderWidth = 1.0;  // 设置边框宽度
    button.layer.cornerRadius = 4.0;  // 设置圆角半径
    button.layer.masksToBounds = YES;  // 避免超出的部分显示
}

@end

Swift

import Cocoa

class NSButtonFactory {
    
    static func createCustomButton(title: String, target: AnyObject?, action: Selector?) -> NSButton {
        let button = NSButton()  // 初始化按钮
        button.title = title  // 设置标题
        button.target = target  // 设置目标
        button.action = action  // 设置动作方法
        applyCustomStyle(to: button)  // 应用自定义样式
        return button
    }
    
    static func createImageButton(image: NSImage, target: AnyObject?, action: Selector?) -> NSButton {
        let button = NSButton()  // 初始化按钮
        button.image = image  // 设置按钮图片
        button.target = target  // 设置目标
        button.action = action  // 设置动作方法
        applyCustomStyle(to: button)  // 应用自定义样式
        return button
    }
    
    private static func applyCustomStyle(to button: NSButton) {
        button.wantsLayer = true  // 启用 Core Animation
        button.layer?.borderColor = NSColor.blue.cgColor  // 设置边框颜色
        button.layer?.borderWidth = 1.0  // 设置边框宽度
        button.layer?.cornerRadius = 4.0  // 设置圆角半径
        button.layer?.masksToBounds = true  // 避免超出的部分显示
    }
}

使用示例

Objective-C

// 创建自定义标题按钮
NSButton *customButton = [NSButtonFactory createCustomButtonWithTitle:@"Custom Button" target:self action:@selector(buttonClicked:)];

// 创建图片按钮
NSButton *imageButton = [NSButtonFactory createImageButtonWithImage:[NSImage imageNamed:@"buttonImage"] target:self action:@selector(buttonClicked:)];

Swift

// 创建自定义标题按钮
let customButton = NSButtonFactory.createCustomButton(title: "Custom Button", target: self, action: #selector(buttonClicked(_:)))

// 创建图片按钮
let imageButton = NSButtonFactory.createImageButton(image: NSImage(named: "buttonImage")!, target: self, action: #selector(buttonClicked(_:)))

标签:layer,target,17,NSButton,button,Mac,按钮,action
From: https://www.cnblogs.com/chglog/p/18345560

相关文章

  • Mac开发基础13-NSTextView(一)
    NSTextView是macOS应用开发中相当强大的多行文本输入控件。它不仅支持文本输入和显示,还支持富文本、文本编辑、布局管理等功能。常见API和基础技巧初始化NSTextView程序化创建Objective-C//创建一个NSScrollView作为NSTextView的容器,因为NSTextView通常需要带滚动条的......
  • Mac开发基础14-NSTextView(二)
    进阶使用和技巧1.扩展查找和替换功能可以自定义查找和替换功能,包括高亮查找结果、批量替换等。查找并高亮Objective-C-(void)highlightOccurrencesOfString:(NSString*)searchString{//清除之前的高亮效果[textView.layoutManagerremoveTemporaryAttribute:N......
  • Xmind2024支持多平台使用,包括Windows、Mac、iOS、等操作系统
    “Xmind2024”是Xmind公司推出的一款全新的思维导图软件,它集成了多种功能,包括智能导图、AI生成、语音输入等。这款产品旨在帮助用户更高效地整理思路,提高思维能力。让我们来了解一下Xmind2024的特点。它采用了全新的设计风格,界面简洁明了,操作便捷。同时,它还提供了丰富的模板......
  • XMind2024思维导图软件特别版+便携版Mac+win+平板
    大家好!今天我们要聊的是一款神奇的思维工具——Xmind2024。你是否常常感到思维混乱,无法集中注意力,或者在处理复杂问题时感到无从下手?如果你有以上的困扰,那么恭喜你,Xmind2024将为你打开一扇全新的大门。让我们先来看看Xmind2024的特点吧。这款产品最大的亮点在于其强大的思维导......
  • Mac开发基础11-NSTextField(一)
    NSTextField是macOS应用中常用的UI元素之一,它用于显示和输入文本。NSTextField提供了丰富的API来定制和处理用户输入。常见API和技巧1.初始化NSTextField程序化创建Objective-CNSTextField*textField=[[NSTextFieldalloc]initWithFrame:NSMakeRect(0,0,20......
  • Mac开发基础12-NSTextField(二)
    NSTextField是一个功能强大的控件,不仅可以作为简单的文本输入框,还可以实现更多高级功能。例如,支持富文本、实现自定义绘制、处理复杂的输入校验等。进阶使用和技巧1.富文本显示与编辑NSTextField支持富文本,也就是说你可以为文本设置不同的颜色、字体、大小等。设置富文本O......
  • odoo17 环境配置
    1、PostgreSql数据库安装教程:Windows上安装PostgreSQL|菜鸟教程(runoob.com) (建议版本15以上)注意:由于Odoo是不允许用pg自带的管理员角色--postgres,所以得创一个odoo使用数据库的角色:createuserodoowithpassword'odoo';alterroleodoowithsuperuser;也可......
  • Mac开发基础09-NSViewController(一)
    NSViewController简介NSViewController是macOS应用程序中的核心类,用于管理单个视图层次结构。它提供了对视图生命周期、布局管理和内容更新的控制,并与模型数据和其他控制器进行交互,提供了高效的视图控制和管理机制。基础知识点NSViewController继承自NSResponder,它主要用......
  • Mac开发基础10-NSViewController(二)
    1.View-BasedUIUpdatesNSViewController提供了很多优化UI更新的方法。利用这些方法,你可以更有效地管理复杂视图的改变。viewWillLayout该方法在控制器的视图层次结构布局之前调用,可以在此方法中修改子视图的布局。Objective-C-(void)viewWillLayout{[superview......
  • Windows 和 MacOS 上安装配置ADB(安卓调试桥)_android adb工具安装 mac
    一、Android调试桥(ADB)Android调试桥(ADB)是一款多功能命令行工具,它让你能够更便捷地访问和管理Android设备。使用ADB命令,你可以轻松执行以下操作网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!在设备上安装、复制和删除文件;安装应用程序;录制设备屏幕或截......