【问题标题】:Maintain margins for drawing after window resize调整窗口大小后保持绘图的边距
【发布时间】:2010-01-11 04:00:02
【问题描述】:

我正在编写一个应用程序在另一个应用程序的窗口中绘制(这是在带有 Cocoa 的 OS X 下,但这个问题很笼统,我希望它不会被操作系统/框架问题所困扰),而且我我遇到了一个似乎应该有一个简单答案的问题,但它让我绝对发疯。问题来了:

我在另一个应用程序的窗口内绘制了一个矩形,该矩形必须位于相对于窗口顶部和左侧的特定位置(即,我的矩形与目标窗口的顶部和左侧之间的边距必须保持固定)。我可以计算所需的相对 x,y 坐标占窗口大小的百分比,效果很好:矩形显示正确。但是,用户然后调整窗口大小,我可以通过使用基于新高度和宽度与旧高度和宽度之比的转换来正确调整矩形的大小,但是我失去了我的相对定位:矩形的坐标现在不正确(见图 - 这是问题的粗略模型)。

image http://img30.imageshack.us/img30/5273/resizeexample.png

现在,我不知道如何计算相对于窗口顶部和左侧的新 x,y 坐标。窗户不是方形的;它的调整大小受其他应用程序的限制,但纵横比宽度/高度会因某些未知函数而变化。当我以相对方式测量所需的 y 坐标时,当窗口调整大小时,百分比会发生变化。从数值上看,它看起来像这样:

调整大小之前:
窗口大小:h=>760,w=>546
矩形原点:x=>355,y=>84(例如 84/546 = 15.3% 的高度)

调整大小后:
窗口大小:h=>1009,w=>717
矩形原点应该是:? (我可以将其测量为 x=>474,y=>99,但我无法预测这些值;现在 99/717 = 13.8% 的高度)。

我已经尝试了我能想到的两个窗口测量值的每个比率;我也遇到过平移到原点,缩放,然后平移回以避免缩放移动坐标的问题的想法 - 但我不知道在哪里翻译回!这可能有一些简单的几何/三角函数解决方案,但无论我画了多少图表,我都没有想到。如果他们能在这里为我指出正确的方向,我愿意接受有人指出这个问题的一些单一解决方案的不可避免的尴尬!

【问题讨论】:

  • “我在另一个应用程序的窗口内画了一个矩形……”你是怎么做到的?
  • 对不起,我写它的方式听起来很奇怪。我没有直接在他们的窗口中绘图,我只是在指定的坐标上创建一个新窗口(NSWindow,级别设置为 NSStatusWindowLevel)。

标签: cocoa math graphics


【解决方案1】:

如果您希望它是左侧的left 单位和顶部的top 单位,则尝试将原点设为:

x:left
y:window.frame.size.height - rectangle.frame.size.height - top

【讨论】:

  • 但是......我不知道窗口调整大小后顶部是什么。那是未知的数量。或者我在这里错过了什么?我可以将移动前的矩形定位为 546 + 84(原点在左上角),但是在窗口调整大小后,我只有新的高度为 717。新的原点应该是 717 + x,但我没有设置 x 以使其与顶部的相对距离与以前相同。 (我测量它为 99,但我不知道如何根据我拥有的值计算该值。)
  • 你不想保持与顶部的距离不变吗?
  • 边距是恒定的,但与顶部的距离不是因为窗口调整大小。我不知道如何比这更好地解释它,这可能是问题的一部分。在 Interface Builder 中,它在自动调整大小控件中看起来像这样:img221.imageshack.us/img221/7292/ibexample.png,尽管我只关心顶部和左侧。请注意,即使窗口调整大小,边距如何保持不变;如果这是我自己的应用程序,Cocoa 会为我做这件事,但我现在不得不自己计算,而且我遇到了麻烦。
  • 所以你想要恒定的高度,按比例增长的顶部和底部边距,以及恒定的左右边距?
  • 矩形必须保持在相对于顶部和左侧的相同位置,因此边距(以顶部和左侧的像素表示)必须更改以保持在那里,例如如果它在中心,则顶部和左侧必须更改,以使矩形保持在中心。我称它们为“常量”是因为我在视觉上思考,但你是对的,随着窗口大小的调整,边距实际上正在增长/缩小。 (底部和右侧对于这个问题并不重要 - 窗口有最小和最大尺寸)。
【解决方案2】:

对于后代:我真的不知道 Apple(或其他任何人)是如何做到这一点的 - 老实说,我认为我试图与之交互的应用程序无论如何都没有考虑到这一点,因为它远非可访问.为了解决这个问题,我最终对一大堆不同的 (x,y) 对进行了采样,并构建了一个线性模型来预测任意坐标的正确坐标。有点像大锤,但这是我能想到的最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2013-03-27
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多