• macOS 开发NSTextView控件 macOS中并没有 UILable ,也没有 NSLabel,虽然有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

    复制粘贴即可运行。

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

  • 相关阅读:
    Android Studio 活动启动模式
    Android Studio 活动的生命周期
    OA表单制作(致远)
    打开excel打印时报“不能使用对象链接和嵌入”
    C#面对对象之封装、继承、多态的简单理解
    C#上手练习7(构造方法语句)
    C#上手练习7(方法语句2)
    C#上手练习6(方法语句1)
    C#上手练习5(GOTO语句)
    C#上手练习4(Break、CONITINUE语句)
  • 原文地址:https://www.cnblogs.com/gaozhang12345/p/16252616.html
Copyright © 2020-2023  润新知