问题标签 [nsview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - NSView 的自动调整大小行为
我需要了解 NSView 如何自动调整它的视图。我已经在 IB 中设置了所有内容,并且我的子视图很好地调整了大小(当我用鼠标调整窗口大小时)。但是,如果我[myMainView setFrame:]
使用我的新框架矩形,则不会发生任何事情。我所有的子视图仍然是原始大小(即使主视图具有正确的尺寸)。Child'sresizeWithOldSuperviewSize:
被调用,但它的大小仍然不合适。
我在屏幕(屏幕#1)、标签、图像、视频上有一个充满可可元素的屏幕。这些元素有一个定义明确的布局。我已经通过界面生成器设置了自动调整大小的行为,效果很好。调整主窗口的大小以令人满意的方式调整元素的大小。
现在,用户单击“下一步”按钮,然后将绘制第二个全屏元素(屏幕#2)。我的布局是基于规范的屏幕尺寸(比如 800x600)构建的。但是现在窗口更大(或更小),因为它在屏幕 #1 中调整了大小。所以元素现在只占据窗口中的一小块区域,而不是适当地调整大小以填充可用空间。我想缩放这些元素。
我是否误解了自动调整大小的工作原理?如何手动触发 NSView 下的自动调整大小机制?
我可以做两件事:
- 根据当前屏幕尺寸相对于原始尺寸手动调整元素的大小。这个选项不是我最喜欢的,因为看起来,我不得不重写已经在 NSView 中工作的代码(自动调整大小的行为
- 我的第二个选择是调用前面提到的 NSView 的自动调整大小的魔法。文档暗示 [NSView setFrame:] 将为我做到这一点。我尝试的是,将我的内容视图调整为原始屏幕尺寸(800x600),渲染我的元素,然后将其调整为当前窗口大小。从概念上讲,它与手动调整窗口大小不同吗?它似乎不是。同样,此选项更可取,因为它最大限度地减少了已编写和维护的代码量。
objective-c - 确定哪个 NSView 实例启动了 mouseDown:
我有一个带有 25 块 myGameTile 的游戏板,这是 NSView 的一个子类。在 mouseDown 中:我想确定我单击了哪个图块并将 ivar 设置为代表值。
例如,如果我单击图块 12,请将 clickedTile 设置为“12”或唯一代表该特定实例的某个值。
我打开了从整数值 12 一直到某种内省/反思的任何东西,尽管内置功能和优雅比 hack、运行时包装器和修改更可取。不过,我知道我可能别无选择,只能依赖这些解决方案,所以也请回答这些问题。我想知道我所有的选择。谢谢!
objective-c - 为什么 Cocoa 应用程序终止时 NSView 的子视图没有发送发布消息?
简短版本:
release
为什么Cocoa 应用程序终止时 NSView 对象的子视图没有发送消息?- 有没有办法覆盖这种行为?
一个例子:
下面展示的MyView
类只不过是一个NSView
子类,它在创建和销毁时向控制台报告。我已经对其进行了测试,发现它可以正常工作。但是,当我按照我的应用程序委托的下一个代码片段所示使用它时,我看到了一些意想不到的东西(请参阅示例输出)。
此应用程序产生以下输出:
开始
初始化<
我的视图:0x10013f840>
初始化我的视图<
:0x10261b620>
运行
退出
dealloc<
我的视图:0x10013f840>
结束。
问题:
我可以清楚地看到当应用程序退出时第一个视图对象正在被释放,并且我确定(经过测试和验证)NSView
对象在它们自己被释放时会自动释放它们的子视图。但是,在应用程序终止期间,这些子视图似乎没有被释放。
长版:(也就是为什么有人会关心?:)
首先让我说我熟悉正在运行的应用程序退出时释放内存的方式。我知道我的子视图将被妥善处理,即使它们从未发送过release
消息,所以我不担心这是泄漏。事实上,我很确定(但不是 100% 确定)我的问题 #1 的答案是:“因为在应用程序即将终止时释放子视图是不必要的。”
当我的应用程序在调试模式下运行时,我使用一些简单的手动代码来进行内存跟踪。我在所有自定义类的 and 方法中调用了一个 and 方法,并在我的应用程序的 Cocoa 部分完成后使用该函数报告Trace_Init()
任何Trace_Dealloc()
未发布的对象。我发现这比定期运行 Apple 的内存泄漏性能工具要简单得多。如果我在运行时导致内存泄漏,我会在我的应用程序退出后立即知道。init
dealloc
atexit()
但是,dealloc
终止期间没有调用意味着NSView
当我退出应用程序时,用作子视图的任何自定义子类都会显示为内存泄漏。因此,我的问题 #2 的原因。我想让 Cocoa 在终止期间释放所有内容,以便我的内存跟踪能够正确结束。自然,我只会覆盖调试模式下的默认行为。我发布的应用程序没有启用任何内存跟踪代码,并且应该能够像平常一样有效地退出。
就是这样!(呼)如果你做到了这一步,感谢你花时间阅读这一切。
objective-c - 在 Cocoa 中动态加载窗口的一部分
我有一个窗口区域(在我的 MainMenu.xib 中),我想根据某些用户选择的标准在不同的时间点用不相关的“视图”(例如 NSTable、IKImageBrowserView 等)动态填充该区域。
- 如何定义窗口的这个区域,以便可以用不同的视图“替换”它?
- 如何将表格或其他视图附加到窗口的这个区域?
(在那里放置一个通用的 NSView 并每次添加一个子视图就足够了吗?我对 Cocoa 相当陌生,所以欢迎任何指针)
objective-c - 没有使用 NSAffineTransforms?
我有一个 NSView 的子类,其中我正在绘制一个 NSImage。我正在取消使用 NSAffineTransforms 来旋转、平移和缩放图像。
大部分工作正常。但是,有时,转换似乎并没有被激活。
例如,当我调整窗口大小时,不会发生旋转变换。
当我放大图像时,它会将图像的左下角放在正确的位置,但不会放大它,但它会放大原始大小图像右侧的图像部分。如果我旋转它,它会正确缩放,但翻译错误。(交易可能是我的计算错误)
这是我的drawRect的代码:(对不起,长代码块)
我需要尽早获取所有内容的大小,以便稍后在旋转时使用它们。我不确定我是否需要保护任何这些,但我对多年的 C 持偏执...
由于我在左下角旋转,并且我希望图像被锁定在左上角,所以我需要移动图像。当我旋转一次时,图像在 +- 象限中,所以我需要将它向上移动一个视图高度,向左移动一个视图高度减去图像高度。等等
这使框架的大小正确,因此图像位于框架的左上角。如果图像大于窗口,我希望框架足够大,以便出现滚动条。如果不是,我希望框架足够大,可以到达窗口的顶部。
这段代码可能完全是历史性的,现在我看了一下......如果我旋转 90 或 270 度,这个想法是交换高度和宽度。
cocoa - 为什么 NSView 的 frame 方法返回错误的结果?
我偶尔想以编程方式更改 NSView 的尺寸。为此,获取各种视图的尺寸,相对于彼此调整它们,然后使用 setFrame: 重新定位是有帮助的。
问题在于,从我的角度来看,frame 方法通常会返回明显错误的 NSRect。
我有一个在 Interface Builder 中设置了 NSPanel 的程序,并与我的主程序建立了各种连接。为了测试帧返回的 NSRect,我在应用程序的 awakeFromNib: 方法中打开了面板,检索了一些 NSRect,并将它们打印到控制台。
这是我的 awakeFromNib:
此代码的结果在控制台中如下所示:
请注意 (i) 面板和两个控件都显示在屏幕上;(ii) 我知道插座已正确连接,因为我可以通过编程方式对控件进行操作并让它们工作;(iii) 界面生成器在“尺寸和位置”下的检查器中显示正确的帧尺寸。
简而言之,该程序的其他所有内容都运行良好。实际上似乎框架尺寸设置不正确或其他什么。
有人可以告诉我如何检索真实的帧信息吗?或者至少解释一下我看到的结果?
cocoa - 在drawRect之外获取NSView的CGContextRef?
我需要获取 NSView 对象的 CGContextRef。如果我知道怎么做就不会那么糟糕了。
在 Carbon 中,这件事是这样完成的:
显然,它可以通过继承 NSView(或它的子类)并将其捕获到它的 drawRect 中来完成,但这太丑陋了。
你的想法?
cocoa - 在 Cocoa 中,将鼠标悬停在圆形视图上时更改光标的最佳方法是什么?
我想做的事
我有一个圆形自定义 NSView 子类,当鼠标悬停在视图的圆形部分上时,我想更改光标的外观,而不是在视图矩形落在圆圈之外的部分上时。
这是一个插图。我会用图像标签内联它,但我太新了,无法参与这些很棒的功能。
到目前为止我所知道的
我知道如何通过 NSCursor 改变光标的外观。我认为为矩形视图完成此操作的最佳方法是使用光标矩形。我知道我可以接收 mouseMoved 事件(并且应该在鼠标不在此视图上方时使用 mouseEntered 和 mouseExited 将其关闭),并且有一种简单、廉价的方法来确定某个点是否位于感兴趣的区域中。
那么有什么问题呢?
据我所知,系统不会将 mouseMoved 事件发送到不是第一响应者的视图。因此,如果我想在鼠标悬停在我的视图上时获取 mouseMoved 事件,我需要从当前拥有它的人那里窃取 firstResponder 状态。如果文本视图有焦点,只需将鼠标移到这样的视图上就会把它偷走,从可用性的角度来看这是不可接受的。
因此,我的问题归结为:有没有更好的方法来做到这一点?我可以在不成为第一响应者的情况下获得 mouseMoved 事件吗?
谢谢!
我会添加以下标签: custom-views mouse-events NSCursor firstResponder 但同样,我是 SA 菜鸟,所以我不能。
objective-c - 在mac的左上角绘制图像的正确方法是什么?
我在 ScrollView 中有一个 NSView,我正在尝试在其中绘制图像。问题是我希望图像的左上角锁定到框架的左上角,而不是左下角,这正是 View 想要我做的。我需要能够放大和缩小,以及旋转。
目前,我有一个系统,我根据图像的大小和窗口的大小计算我必须翻译多少图像。为了做到这一点,我需要在滚动视图之外创建一个额外的视图,这样我就可以获得窗口的大小,不包括装饰。然后我可以根据图像的大小和窗口的大小来计算视图的大小,并据此计算出将图像转换到的位置。
我唯一的另一个想法是使用 isFlipped: 方法,但这最终会反转我的图像 LR,这很糟糕。
我应该这样做吗?
objective-c - 用播放器移动 NSView 边界的更好方法?
目前正在编写 roguelike 以了解有关 Objective-C/Cocoa 的更多信息。到目前为止,我真的很喜欢它,而且我学到了很多东西。
此代码移动origin
视图的bounds
,以便它在玩家移动时跟随玩家。代码运行完美,我只是问是否有比使用 4 更好for
的方法。
在某些情况下,我还看到最好分开做事情而不是一体做事,尤其是在绘图和nsbezierpath
涉及到的情况下,这是为什么呢?
编辑:人们很难弄清楚我在做什么,所以我会尽可能多地分解它。
这view
是一个 30x30 的网格 (0-29,0-29),每个 20x20。地图可以根据需要变大或变小。
首先,您得到,[player_ location]
以及origin
的bounds
。view
它被除以20
因为瓷砖大小是20,
所以当它在 时(1,2)
,它实际上是在(20,40)
。我这样做的唯一原因是使其更易于操作(以 1 为单位比以 20 为单位更容易计数)。四个人for
通过并检查[player_ location]
是否在中心 ( ) 的15
瓷砖内。如果玩家正在向屏幕的边缘之一移动,并且小于当前地图的高度/宽度,它会移动 以使玩家仍然居中并显示在地图上。bounds + 15
view
bounds.x/y + 30
origin
代码运行完美,我在 ' 发生setbounds
后将其移至for
,并且只有一个。它没有被遗忘drawRect
,我只是在这里尝试弄清楚我需要做什么。它现在在它自己的位置,并且仅在玩家实际移动时才被调用。
这是新代码:
这是它的图片!
图 1:这是 1,1 处的玩家。没什么特别的。 http://sneakyness.com/stackoverflow/SRLbounds1.png
图 2:3 个金块表示在视图的 bounds.origin 移动到保持在玩家中心之前玩家可以移动多远。尽管无关紧要,但请注意玩家实际上看不到黄金。事实证明,编程视野是一个备受争议的领域,您可以使用几种不同的算法,它们都没有缺点,或者已被移植到 Objective-C。目前它只是一个正方形。看穿墙壁和一切。 http://sneakyness.com/stackoverflow/SRLbounds2.png
图 3:具有不同 bounds.origin 的视图,以玩家为中心。 http://sneakyness.com/stackoverflow/SRLbounds3.png