【问题标题】:Cocoa webview and transparent window troublesCocoa webview和透明窗口的烦恼
【发布时间】:2014-12-15 15:59:10
【问题描述】:

我在这里制作了一个简单的应用程序:https://github.com/ber4444/easycountdown for New Year's Eve - 我的第一个 Cocoa 应用程序。

第一个问题是午夜计数器(实际上是 web 视图)没有正确缩放。您可以将项目加载到 Xcode 并尝试使用 Cmd+Shift+Plus/Minus 来回缩放。它只放大一步(通过从AppWindow.m 调用的JavaScript zoom()),太快并且无法缩小。我不明白为什么,有什么想法吗?

第二个问题是,当您用鼠标在 webview 上拖动时,很容易点击它——将整个窗口发送到背景——每当用户不小心在字符之间点击时。这是由于[window setOpaque:NO] 是透明所必需的。我希望窗口始终捕捉鼠标拖动事件,我该怎么做?

【问题讨论】:

  • 2个问题应该在帖子中处理。它们不相关;)我回答了第二个,因为这也是标题所说的。
  • 我修改了答案,但您仍然应该拆分问题

标签: javascript objective-c macos cocoa webview


【解决方案1】:

关于透明窗口点击问题

默认行为:窗口管理器允许点击透明部分 => 对我们不利! :D

所以我们必须欺骗他看到不透明的东西:

1 步

修改 contentView 以具有 CALayer(在 InterfaceBuilder 中执行此操作)

2 步

不要将 mainView 设置为您的内容视图,而是将主视图设置为内容视图的子视图

[[window contentView] addSubview:mainView];//was setContentView call

3 步

由于mainView不再是windows的contentView,所以无法访问AppWindow.m中的view。

修复

id mainView = [[self.contentView subviews] lastObject];
NoClickWebView *aWebView = [[mainView subviews] lastObject];//used contentView subviews

关于糟糕的缩放。

这里困扰我们的问题是 javascript 没有输入:调用 zoom += percent 被视为字符串的串联,导致 ~30.1 或 3-0.1 :P

要修复它,强制 JS 一直把它当作浮动:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
                <style type='text/css'>
                #slider-full-width{
                        text-align: center;
                    }
                #slider-full-width h2 {
                    color: #0000CC;
                    text-shadow: 1px 1px 1px #FFF;
                }
                </style>
                <script type='text/javascript'>//<![CDATA[
                function dummy(text) {
                    document.getElementById("counter").innerHTML = text;
                }
                function zoom(percent) {
                    var zoomText = document.getElementById("counter").style.zoom;
                    var zoom = parseFloat(zoomText);
                    zoom += parseFloat(percent);

                    document.getElementById("counter").style.zoom = zoom;
                }
                //]]>
                </script>
        </meta>
    </head>
    <body>
        <div id="slider-full-width">
            <h2 id="counter" style="zoom: 3.0"></h2>
        </div>
    </body>
</html>

【讨论】:

  • 请注意您没有将项目提交到 github
  • 谢谢,我把你的解决方案推送到了github,它解决了第一个问题;但是在缩放时我现在遇到了一个异常:Countdown[...] -[NSView windowScriptObject]: unrecognized selector sent to instance
  • 是的,因为 mainView 不再是内容视图。在应用程序窗口类中修复它
  • ` id mainView = [[self.contentView subviews] lastObject]; NoClickWebView *aWebView = [[mainView subviews] lastObject];`
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2017-01-28
  • 2013-02-21
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多