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

Mac开发基础12-NSTextField(二)

时间:2024-08-06 16:18:07浏览次数:7  
标签:12 自定义 void NSTextField Mac textField customizer self

NSTextField 是一个功能强大的控件,不仅可以作为简单的文本输入框,还可以实现更多高级功能。例如,支持富文本、实现自定义绘制、处理复杂的输入校验等。

进阶使用和技巧

1. 富文本显示与编辑

NSTextField 支持富文本,也就是说你可以为文本设置不同的颜色、字体、大小等。

设置富文本

Objective-C
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Hello, World!"
                                                                 attributes:@{
                                                                              NSForegroundColorAttributeName: [NSColor blueColor],
                                                                              NSFontAttributeName: [NSFont fontWithName:@"Helvetica-Bold" size:16]
                                                                              }];
[self.textField setAttributedStringValue:attrString];
Swift
let attrString = NSAttributedString(string: "Hello, World!", attributes: [
    .foregroundColor: NSColor.blue,
    .font: NSFont(name: "Helvetica-Bold", size: 16)!
])
textField.attributedStringValue = attrString

2. 自定义绘制文本字段

可以通过子类化 NSTextField 实现自定义的绘制逻辑,以实现独特的 UI 效果。

自定义绘制

Objective-C
@implementation CustomTextField

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    
    // 自定义绘制背景
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
    
    // 自定义绘制文本
    NSDictionary *attributes = @{
                                 NSFontAttributeName: [NSFont systemFontOfSize:14],
                                 NSForegroundColorAttributeName: [NSColor blackColor]
                                 };
    NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:self.stringValue attributes:attributes];
    [attrString drawInRect:dirtyRect];
}

@end
Swift
class CustomTextField: NSTextField {
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        // 自定义绘制背景
        NSColor.white.setFill()
        dirtyRect.fill()
        
        // 自定义绘制文本
        let attributes: [NSAttributedString.Key: Any] = [
            .font: NSFont.systemFont(ofSize: 14),
            .foregroundColor: NSColor.black
        ]
        let attrString = NSAttributedString(string: self.stringValue, attributes: attributes)
        attrString.draw(in: dirtyRect)
    }
}

3. 定制化输入校验与过滤

可以使用 NSTextFieldDelegate 来实现定制化的输入校验和过滤功能。

实现输入过滤

Objective-C
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
    if (commandSelector == @selector(insertNewline:)) {
        NSString *inputText = [textView string];
        // 自定义校验逻辑
        if ([self isValidInput:inputText]) {
            return NO; // 允许插入新行
        } else {
            return YES; // 禁止插入新行
        }
    }
    return NO;
}
Swift
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
    if commandSelector == #selector(insertNewline(_:)) {
        let inputText = textView.string
        // 自定义校验逻辑
        if isValidInput(inputText) {
            return false // 允许插入新行
        } else {
            return true // 禁止插入新行
        }
    }
    return false
}

4. 处理剪切板操作

可以拦截并处理剪切板(拷贝、剪切、粘贴)操作,从而实现更多控制。

自定义剪切板操作处理

Objective-C
- (void)paste:(id)sender {
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    NSString *pasteString = [pasteboard stringForType:NSPasteboardTypeString];
    
    // 自定义粘贴逻辑
    if ([self isValidInput:pasteString]) {
        [self setStringValue:pasteString];
    } else {
        NSBeep(); // 发出警告声
    }
}
Swift
override func paste(_ sender: Any?) {
    let pasteboard = NSPasteboard.general
    if let pasteString = pasteboard.string(forType: .string) {
        // 自定义粘贴逻辑
        if isValidInput(pasteString) {
            self.stringValue = pasteString
        } else {
            NSBeep() // 发出警告声
        }
    }
}

5. 自定义工具类封装

封装一个 NSTextField 的工具类,提供多个接口供外部使用,可灵活定制。

Objective-C

@interface NSTextFieldCustomizer : NSObject

@property (nonatomic, strong) NSTextField *textField;

- (instancetype)initWithTextField:(NSTextField *)textField;

- (void)setPlaceholder:(NSString *)placeholder;
- (void)setTextColor:(NSColor *)color;
- (void)setFont:(NSFont *)font;
- (void)setAlignment:(NSTextAlignment)alignment;
- (void)setEditable:(BOOL)editable;
- (void)setBordered:(BOOL)bordered;
- (void)setBackgroundColor:(NSColor *)color;

@end

@implementation NSTextFieldCustomizer

- (instancetype)initWithTextField:(NSTextField *)textField {
    self = [super init];
    if (self) {
        _textField = textField;
    }
    return self;
}

- (void)setPlaceholder:(NSString *)placeholder {
    [self.textField setPlaceholderString:placeholder];
}

- (void)setTextColor:(NSColor *)color {
    [self.textField setTextColor:color];
}

- (void)setFont:(NSFont *)font {
    [self.textField setFont:font];
}

- (void)setAlignment:(NSTextAlignment)alignment {
    [self.textField setAlignment:alignment];
}

- (void)setEditable:(BOOL)editable {
    [self.textField setEditable:editable];
}

- (void)setBordered:(BOOL)bordered {
    [self.textField setBordered:bordered];
}

- (void)setBackgroundColor:(NSColor *)color {
    [self.textField setBackgroundColor:color];
}

@end

Swift

class NSTextFieldCustomizer {

    private weak var textField: NSTextField?

    init(textField: NSTextField) {
        self.textField = textField
    }

    func setPlaceholder(_ placeholder: String) {
        textField?.placeholderString = placeholder
    }

    func setTextColor(_ color: NSColor) {
        textField?.textColor = color
    }

    func setFont(_ font: NSFont) {
        textField?.font = font
    }

    func setAlignment(_ alignment: NSTextAlignment) {
        textField?.alignment = alignment
    }

    func setEditable(_ editable: Bool) {
        textField?.isEditable = editable
    }

    func setBordered(_ bordered: Bool) {
        textField?.isBordered = bordered
    }

    func setBackgroundColor(_ color: NSColor) {
        textField?.backgroundColor = color
    }
}

使用示例

Objective-C

NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 22)];
NSTextFieldCustomizer *customizer = [[NSTextFieldCustomizer alloc] initWithTextField:textField];
[customizer setPlaceholder:@"Enter your name"];
[customizer setTextColor:[NSColor blueColor]];
[customizer setFont:[NSFont fontWithName:@"Helvetica" size:14]];
[customizer setAlignment:NSTextAlignmentCenter];
[customizer setEditable:YES];
[customizer setBordered:YES];
[customizer setBackgroundColor:[NSColor whiteColor]];

Swift

let textField = NSTextField(frame: NSMakeRect(0, 0, 200, 22))
let customizer = NSTextFieldCustomizer(textField: textField)
customizer.setPlaceholder("Enter your name")
customizer.setTextColor(.blue)
customizer.setFont(NSFont(name: "Helvetica", size: 14)!)
customizer.setAlignment(.center)
customizer.setEditable(true)
customizer.setBordered(true)
customizer.setBackgroundColor(.white)

标签:12,自定义,void,NSTextField,Mac,textField,customizer,self
From: https://www.cnblogs.com/chglog/p/18345386

相关文章

  • 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学习资源包免费分享!在设备上安装、复制和删除文件;安装应用程序;录制设备屏幕或截......
  • 洛谷P1209修理牛棚 Barn Repair
    [USACO1.3]修理牛棚BarnRepair题目描述在一个月黑风高的暴风雨夜,FarmerJohn的牛棚的屋顶、门被吹飞了好在许多牛正在度假,所以牛棚没有住满。牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。有些牛棚里有牛,有些没有。所有的牛棚有相同的宽度。宽度为1自门遗失以后......
  • Mac开发基础08-NSWindow(二)
    NSWindow其他使用和技巧NSWindow是macOS应用程序中用于显示和管理窗口的核心类。可用于创建、编辑和管理应用程序的窗口。1.自定义窗口的内容视图层级替换默认的内容视图NSWindow默认包含一个内容视图,你可以使用自定义内容视图来替换它。Objective-CNSView*customVie......
  • Mac开发基础06-NSView(二)
    要理解NSView更深层的知识,涉及到其渲染机制、事件处理流程、与CALayer的关系及性能优化等方面。1.NSView绘制和渲染机制NSView的绘制过程主要依赖于drawRect:(Objective-C)或draw(_:)(Swift)方法。这个方法被调用是由系统驱动的,通常发生在需要重新绘制视图的时候,如窗口首次......
  • Mac开发基础05-NSView
    NSView概述NSView是macOS应用中所有用户界面元素的基类。它提供了一系列功能用于视图的绘制、事件处理、动画、自动布局等。1.基本属性bounds和framebounds描述了视图自身坐标系中的矩形区域,而frame描述了视图在其父视图坐标系中的矩形区域。Objective-CNSView*v......
  • 洛谷P1081【NOIP2012提高组】开车旅行
    题目见[NOIP2012提高组]开车旅行-洛谷(懒得打题目了)我们直接上代码#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<iomanip>#include<algorithm>#include<ctime>#include<queue>......
  • Plugin Boutique Scaler EQ V1.1.3_WIN-TCD&MAC-HCiSO(2024.08更新),持续更新长期有效
    一。PluginBoutiqueScalerEQ1.1.3WIN-TCD&MAC-HCiSO   紧随屡获殊荣的音乐理论插件Scaler之后,ScalerEQ以一种引人注目的全新方式提供了音乐性和色彩的均衡。ScalerEQ是PluginBoutique推出的一款创新均衡器插件,结合传统和和声均衡功能,专注于音乐理论,为音乐制作和混......
  • 2024上岸|鱼类增养殖学(927)129备考攻略
    前言......