如何在 NSTexturedSquareBezelStyle 按钮周围绘制边框

Posted

技术标签:

【中文标题】如何在 NSTexturedSquareBezelStyle 按钮周围绘制边框【英文标题】:How to draw a border around an NSTexturedSquareBezelStyle button 【发布时间】:2015-04-22 19:03:28 【问题描述】:

前几天我注意到我的一个网页看起来很丑。页面上的按钮看起来像 totally different,取决于它们是否包含一行或两行文本。

经过一番挖掘,我了解到典型的按钮使用NSRoundedBezelStyle,但它具有固定的高度。因此,如果文本要换行,Firefox(以及 Chrome 和 Safari)将 change the button to use NSShadowlessSquareBezelStyle 可以具有可变高度。我想请求这些浏览器的维护者改变这一点,并正在研究最好的替代方案。

在找到already-filed bug 并做了一些阅读后,我建议他们也许可以改用NSTexturedSquareBezelStyle。事实证明,在 Mavericks 中,它看起来与 NSRoundedBezelStyle 按钮几乎完全相同。在优胜美地也是一样,只是它没有边界。更改setBordered 无效。

所以我代表各地的浏览器开发人员提出问题:是否可以绘制一个带边框的NSTexturedSquareBezelStyle 按钮?或者,是否有其他所有浏览器供应商都错过的解决方法?

【问题讨论】:

【参考方案1】:

重写答案

我在 Yosemite 中没有看到无边框的 NSTexturedSquareBezelStyle 按钮:

这是一个从 Interface Builder 的调色板中拖出的股票按钮。我鼓励您发布代码,因为您可能正在代码中生成按钮。这是我自己生成相同按钮的代码:

NSButton * anotherButton = [[NSButton alloc] initWithFrame:NSMakeRect(10.0, 10.0, 100.0, 100.0)];
anotherButton.bezelStyle = NSTexturedSquareBezelStyle;
anotherButton.title = @"Line 1\nLine 2";

证明:

如果您在 Yosemite 下看到不同的结果,则需要发布您的代码。猜测一下,您可能使用-init 而不是-initWithFrame: 来初始化您的按钮,这可能会导致各种绘图问题,因为NSButtonNSView,因此其指定的初始化程序是-initWithFrame:。不过只是猜测。

【讨论】:

边框非常细,但不足以与白色背景或浅色图像形成对比。在 Mavericks 中,这个按钮看起来就像一个普通的按钮,这正是我所希望的。令人沮丧的是,Apple 没有在其 API 中解决如此明显的限制。 当然,除了能够对按钮单元进行子类化和覆盖其绘图之外。 ;-)

以上是关于如何在 NSTexturedSquareBezelStyle 按钮周围绘制边框的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?