首页 > 其他分享 >Mac开发基础05-NSView

Mac开发基础05-NSView

时间:2024-08-06 14:06:03浏览次数:13  
标签:05 NSView 视图 Mac subview Swift event view

NSView 概述

NSView 是 macOS 应用中所有用户界面元素的基类。它提供了一系列功能用于视图的绘制、事件处理、动画、自动布局等。

1. 基本属性

bounds 和 frame

bounds 描述了视图自身坐标系中的矩形区域,而 frame 描述了视图在其父视图坐标系中的矩形区域。

Objective-C
NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 200, 200)];
NSLog(@"Bounds: %@", NSStringFromRect(view.bounds)); // Bounds: (0.0, 0.0, 200.0, 200.0)
NSLog(@"Frame: %@", NSStringFromRect(view.frame));   // Frame: (0.0, 0.0, 200.0, 200.0)
Swift
let view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
print("Bounds: \(view.bounds)") // Bounds: (0.0, 0.0, 200.0, 200.0)
print("Frame: \(view.frame)")   // Frame: (0.0, 0.0, 200.0, 200.0)

alphaValue

用于设置视图的透明度。

Objective-C
view.alphaValue = 0.5;  // 设置透明度为50%
Swift
view.alphaValue = 0.5  // 设置透明度为50%

hidden

用于控制视图的可见性。

Objective-C
view.hidden = YES;  // 隐藏视图
Swift
view.isHidden = true  // 隐藏视图

backgroundColor

NSView 本身没有 backgroundColor 属性,但可以通过 wantsLayer 属性和 CALayer 支持来实现背景颜色。

Objective-C
[view setWantsLayer:YES];
view.layer.backgroundColor = [[NSColor blueColor] CGColor];
Swift
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.blue.cgColor

2. 图层和动画

wantsLayer

启用 Core Animation 支持,通过设置 wantsLayertrueYES 为视图创建一个 CALayer

Objective-C
view.wantsLayer = YES;
Swift
view.wantsLayer = true

隐式动画

可以通过 Core Animation 隐式动画来实现属性变化的平滑过渡。

Objective-C
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
view.layer.backgroundColor = [[NSColor greenColor] CGColor];
[CATransaction commit];
Swift
CATransaction.begin()
CATransaction.setAnimationDuration(1.0)
view.layer?.backgroundColor = NSColor.green.cgColor
CATransaction.commit()

3. 事件处理

鼠标事件

重写相关方法来处理鼠标交互。

Objective-C
- (void)mouseDown:(NSEvent *)event {
    NSLog(@"Mouse down at location: %@", NSStringFromPoint(event.locationInWindow));
}

- (void)mouseDragged:(NSEvent *)event {
    NSLog(@"Mouse dragged");
}

- (void)mouseUp:(NSEvent *)event {
    NSLog(@"Mouse up");
}
Swift
override func mouseDown(with event: NSEvent) {
    print("Mouse down at location: \(event.locationInWindow)")
}

override func mouseDragged(with event: NSEvent) {
    print("Mouse dragged")
}

override func mouseUp(with event: NSEvent) {
    print("Mouse up")
}

键盘事件

视图需要先成为 "First Responder",才能处理键盘事件。

Objective-C
- (BOOL)acceptsFirstResponder {
    return YES;
}

- (void)keyDown:(NSEvent *)event {
    NSLog(@"Key down: %hu", event.keyCode);
}

- (void)keyUp:(NSEvent *)event {
    NSLog(@"Key up: %hu", event.keyCode);
}
Swift
override var acceptsFirstResponder: Bool {
    return true
}

override func keyDown(with event: NSEvent) {
    print("Key down: \(event.keyCode)")
}

override func keyUp(with event: NSEvent) {
    print("Key up: \(event.keyCode)")
}

4. 自动布局和约束

自动布局

通过 NSLayoutConstraint 来管理视图之间的布局关系。

Objective-C
NSView *subview = [[NSView alloc] init];
[subview setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addSubview:subview];

[NSLayoutConstraint activateConstraints:@[
    [subview.topAnchor constraintEqualToAnchor:view.topAnchor constant:10],
    [subview.leadingAnchor constraintEqualToAnchor:view.leadingAnchor constant:10],
    [subview.widthAnchor constraintEqualToConstant:100],
    [subview.heightAnchor constraintEqualToConstant:100]
]];
Swift
let subview = NSView()
subview.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(subview)

NSLayoutConstraint.activate([
    subview.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
    subview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
    subview.widthAnchor.constraint(equalToConstant: 100),
    subview.heightAnchor.constraint(equalToConstant: 100)
])

5. 绘制内容

重写 draw(_:)

通过重写 draw(_:) 来自定义视图的绘制内容。

Objective-C
- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // 自定义绘制代码
    CGContextRef context = [[NSGraphicsContext currentContext] CGContext];
    CGContextSetFillColorWithColor(context, [[NSColor redColor] CGColor]);
    CGContextFillRect(context, dirtyRect);
}
Swift
override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)

    // 自定义绘制代码
    if let context = NSGraphicsContext.current?.cgContext {
        context.setFillColor(NSColor.red.cgColor)
        context.fill(dirtyRect)
    }
}

6. 子视图管理

添加、移除和替换子视图

Objective-C
// 添加子视图
NSView *subview = [[NSView alloc] initWithFrame:NSMakeRect(50, 50, 100, 100)];
[subview setWantsLayer:YES];
subview.layer.backgroundColor = [[NSColor greenColor] CGColor];
[view addSubview:subview positioned:NSWindowAbove relativeTo:nil];

// 移除子视图
[subview removeFromSuperview];

// 替换子视图
NSView *newSubview = [[NSView alloc] initWithFrame:NSMakeRect(50, 50, 100, 100)];
[view replaceSubview:subview with:newSubview];
Swift
// 添加子视图
let subview = NSView(frame: NSRect(x: 50, y: 50, width: 100, height: 100))
subview.wantsLayer = true
subview.layer?.backgroundColor = NSColor.green.cgColor
view.addSubview(subview, positioned: .above, relativeTo: nil)

// 移除子视图
subview.removeFromSuperview()

// 替换子视图
let newSubview = NSView(frame: NSRect(x: 50, y: 50, width: 100, height: 100))
view.replaceSubview(subview, with: newSubview)

7. 坐标转换

转换坐标系中的点

Objective-C
NSPoint pointInWindow = NSMakePoint(10, 10);
NSPoint pointInSubview = [view convertPoint:pointInWindow toView:subview];
NSLog(@"Point in subview: %@", NSStringFromPoint(pointInSubview));
Swift
let pointInWindow = NSMakePoint(10, 10)
let pointInSubview = view.convert(pointInWindow, to: subview)
print("Point in subview: \(pointInSubview)")

标签:05,NSView,视图,Mac,subview,Swift,event,view
From: https://www.cnblogs.com/chglog/p/18345010

相关文章

  • CVE-2023-0562银行储物柜管理系统登录页面sql注入漏洞靶场复现
    在PHPGurukul银行储物柜管理系统1.0中发现了一个漏洞。它被评定为临界状态。受此问题影响的是组件登录的文件index.php的一些未知功能。对参数username的操作会导致sql注入。攻击可能是远程发起的。该漏洞已被公开,并可能被利用。此漏洞的标识符是VDB-219716。抓登录包放salmap......
  • Plugin Boutique Scaler EQ V1.1.3_WIN-TCD&MAC-HCiSO(2024.08更新),持续更新长期有效
    一。PluginBoutiqueScalerEQ1.1.3WIN-TCD&MAC-HCiSO   紧随屡获殊荣的音乐理论插件Scaler之后,ScalerEQ以一种引人注目的全新方式提供了音乐性和色彩的均衡。ScalerEQ是PluginBoutique推出的一款创新均衡器插件,结合传统和和声均衡功能,专注于音乐理论,为音乐制作和混......
  • Python-MNE全套教程(官网翻译)-入门05:关于传感器位置
    本教程描述了如何读取和绘制传感器位置,以及MNE-Python如何处理传感器的物理位置。像往常一样,我们将从导入我们需要的模块开始:frompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpimportmne关于montage和layout(蒙太奇和传感器布局)montage......
  • 【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
    【RISC-V设计-05】-RISC-V处理器设计K0A之GPR1.简介通用寄存器(GeneralPurposeRegister)是处理器设计中的重要组成部分,在数据处理和指令执行过程中发挥着关键作用,对于计算机系统的整体性能和效率有着至关重要的影响。通用寄存器用于传送和暂存数据,也可参与算术逻辑运算,并......
  • stm32入门-----硬件I2C读写MPU6050
     目录前言 一、stm32中I2C库函数介绍(stm32f10x_i2c.h)1.初始化2.使能操作3.生成起始位和结束位标志4.发送I2C从机地址5.发送数据和接收数据6.发送应答位7.状态检测二、硬件I2C读取MPU60501.电路连线图2.主要工程文件 3.MPU6050.c代码剖析(1)检测步骤超时操作(2)指......
  • GMOJ 8105. 代码之神 小Y
    给你\(L\le10^6\),\(x,y\le100\),要求\(\sum_{lcm(a,b)\leL}\left|ax-by\right|\)。喜闻乐见的推式子:\[\begin{aligned}&\sum_{lcm(a,b)\leL}\left|ax-by\right|\\&=\sum_{d=1}^Ld\sum_{a=1}^{\lfloor\frac{L}{d}\rfloor}\sum_......
  • 《Advanced RAG》-05-探索语义分块(Semantic Chunking)
    摘要文章首先介绍了语义分块在RAG中的位置和作用,并介绍了常见的基于规则的分块方法。然后,阐述了语义分块的目的是确保每个分块包含尽可能多的独立语义信息。接着,文章分别介绍了三种语义分块方法的原理和实现方法,并对每种方法进行了总结和评估。文章观点语义分块是R......
  • 【闲话】08.05.24
    0805闲话头图:今日推歌:《1212。》エイハブ/A4。おおおのべつ幕無しのこの世噢噢噢如此无止境的人世间本能の赴くままに在本能的驱使下随之逐流生きる意義は推して知るべし最后在其中知晓活着的意义そりゃ幸じゃんか这是多么幸运啊好久没听到这么舒服的人声了…......
  • BitDock:为Windows桌面带来Mac风格的美化工具(附下载)
    许多人对Mac系统的精致界面情有独钟,但面对苹果电脑不菲的价格标签——就例如年初新登场的基础款MacBookAir,即便配置朴素,也轻易跨过了八千大关(这预算在Windows阵营足以拥抱高端配置),不免让人望而却步。幸运的是,将Windows系统改头换面,焕发Mac般的高雅并非遥不可及的梦想。下载:Bi......
  • Parallels Desktop19.3.0虚拟机软件可以让你在Mac上同时运行Windows、Linux等多个系统
    ParallelsDesktop19,一个虚拟机软件,可以让你在Mac上同时运行Windows、Linux等多个系统。听起来是不是很厉害?但其实它还有更多隐藏的小技巧等着你去发现。如果你还在因为Mac和Windows之间的不兼容而苦恼,那么ParallelsDesktop19就是你的救星。它可以帮助你轻松地在Mac上运行Win......