macOS 开发NSTextView控件与 NSTextField控件

Cocoa 中提供文本编辑功能的类只有 NSTextView

NSTextField 不是 NSTextView 的封装,它的作用是为实际承担编辑工作的 NSTextView 提供操作「场所」。其名称中「field」的意义不是表格或文件格式意义上的 field。当一个 NSTextField 控件不拥有焦点的时候,它只显示自己存储的文本值 [2],并不和 NSTextView 有任何关系。当它获得焦点时,其所在的窗口会把一个 NSTextView 控件置于其上,并将原来的 NSTextField 对象设置为该 NSTextView 对象的 delegate,真正获取焦点并且成为 first responder 的控件是 NSTextView 对象。在同一窗口中,置于所有 NSTextField 之上的是同一个 NSTextView 对象实例。因为只有一个控件能获得焦点,所以共享单一的 NSTextView 实例没有问题。这个唯一的实例称为「field editor」,即放置在 text field 上的 editor。

开始我们的学习

 

mac os开发中只设置textView是不可用的(因为无法滚动)。需要添加到scrollview上面。下面纯代码创建NSTextView。

上代码

#import "ViewController.h"

@interface ViewController ()

/** macos 文本控件 */
@property (nonatomic, weak) NSTextView *myTextView;
/** macos 滚动控件 */
@property (nonatomic, weak) NSScrollView *myscrollView;

@end


@implementation ViewController

#pragma mark 懒加载 macos 控件
- (NSTextView *)myTextView {
    if (!_myTextView) {
        NSTextView *text = [[NSTextView alloc] init];
        [self.myscrollView setDocumentView:text];//设置内容视图
        // [self.myscrollView addSubview:text];;虽然也能添加上,但是不能滑动什么的
        _myTextView = text;
        _myTextView.backgroundColor = [NSColor whiteColor];
        _myTextView.editable = NO;//设置是否可编辑
        _myTextView.textColor = [NSColor blackColor];
        _myTextView.font = [NSFont systemFontOfSize:12];
    }
    return _myTextView;
}

- (NSScrollView *)myscrollView {
    if (!_myscrollView) {
        NSScrollView *scroll = [[NSScrollView alloc] init];
        [self.view addSubview:scroll];
        _myscrollView = scroll;
        [scroll setBorderType:NSNoBorder];
        [scroll setHasVerticalScroller:YES];//控制垂直滑动
        [scroll setHasHorizontalScroller:NO];//控制水平滑动
        [scroll setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
    }
    return _myscrollView;
}

-(void)viewDidLoad {
    [super viewDidLoad];
    
    //控件布局既可以在这里,也可以在viewDidLoad中,任意调整位置
    CGFloat textX = 10;
    CGFloat textY = 20;
    CGFloat textW = 150;
    CGFloat textH = 280;
    self.myTextView.frame = CGRectMake(textX, textY, textW, textH);
    
    CGFloat scrollX = 100;
    CGFloat scrollY = 50;
    CGFloat scrollW = 200;//self.view.frame.size.width;
    CGFloat scrollH = 100;
    self.myscrollView.frame = CGRectMake(scrollX, scrollY, scrollW, scrollH);
    
    //TextView的内容
    _myTextView.string = @"bgeg;jkhndsafgneawrgaeork'gmnafsdivjiearnglkerklermnfsdjvijdfkgnjkldfjsgnekffjksdfasienmfdviisdngsdhnvisanfkdjfiosadaerwnaejkwchvaiuvndjknfakdsiasdjfklwaenfiovnawegfnawejhfvuashfjkfkjashdfhasdwejkfaisdvbfgbfjsdhfshfwbnjvchawjwov fbhwh fvwhfoiuwjwnbcuweabfjkwdbfuiwabfrjwkcvudghfjaw bjklenfaihbwerbqweevbfkqwjfhoiwehfjfjhfsdajfdnefdsisdjfkfj8nfjikfjjfkenfkldhfifjkwdafioernfkjdncvhfvnfklchviodnbfjkldhfdnfehfinfjkehfiuehfejkdjhfdjfhnkdlsjsnfdnfdsjkfjksfjkdsfjfidskfjdfisdjfiesmnkdmncvijskdnfahfidsekaisjkfdmnekjfewknmdiowjdfikamwjidwkfkgaisnfeiohfenfkjeheiufnehfiodjfkasjfiosajeinfiefkwaejfidsfiodsjfenfisdkdsnfihfienfdklhfjkewnrekjikefieifniddklsjfkdsjfksdjfienmfkenfisenfkejionfisdkjfkdshjidnfeifwkfn";
   
    [[self.myscrollView contentView] setPostsBoundsChangedNotifications: YES];//发起通知
        //找个合适的地儿,注册通知
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter] ;
            [center addObserver: self
                       selector: @selector(boundsDidChangeNotification:)
                           name: NSViewBoundsDidChangeNotification
                         object: [self.myscrollView contentView]];
   
}

- (void) boundsDidChangeNotification: (NSNotification *) notification{
    // 在这里进行处理
    NSClipView *changedContentView = [notification object];
    
    // get the origin of the NSClipView of the scroll view that
    // we're watching
    
    NSPoint changedBoundsOrigin = [changedContentView documentVisibleRect].origin;
    NSLog(@"滑动中%f\n",changedBoundsOrigin.y);
    //判断滚动条移动高度变化确认是否移动拉动滚动到底
    if (changedBoundsOrigin.y > 560) {
        NSLog(@"滑动到底了");
    }else{
        NSLog(@"滑动中");
    }
    
}

@end

复制粘贴即可运行。

大部分人总是先看见才会相信,所以先跑起来看了结果再努力。

 

posted on 2022-05-10 14:20  高彰  阅读(680)  评论(0编辑  收藏  举报

导航