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
复制粘贴即可运行。
大部分人总是先看见才会相信,所以先跑起来看了结果再努力。