【问题标题】:Transparent WebView (with drawsBackground = false)透明 WebView(drawsBackground = false)
【发布时间】:2014-01-19 13:19:47
【问题描述】:

我有一个例子,它有一个透明的 web 视图,里面有一些 html 控件。 WebView 控件设置为drawsBackground 为假,它在isOpaque 为假且backgroundColor 为清除的窗口上打开——这会产生一个带有html 控件的完全透明的窗口。 唯一的问题是透明区域没有点击通过(我的点击在webview上停止了)。

有人知道是否有办法让它“点击”吗?

【问题讨论】:

  • 嗨。您是否有理由不接受我几天前接受的回答??
  • 是的,你误会了。我想要具有透明 page 背景的 webview。不是透明的 webView。
  • 你确实说“它有一个透明的网络视图”。如果那是错误的,不知道为什么你首先接受它。你能张贴你所拥有的屏幕截图吗?如果您使用 webView 和 NSWindow 元素类名称也会有所帮助。你可以这样做,以便更容易理解你的意思。即什么是页面?控件是什么——

标签: objective-c macos cocoa webview monomac


【解决方案1】:

在 WebView 的自定义子类中,您可以实现:

- (NSView *)hitTest:(NSPoint)aPoint;

如果用户点击透明区域,则返回 nil。

【讨论】:

  • 没关系,但是我如何检测点击是否在 webview 内容的顶部(如字母“O”)并检测点击是否在字母“O”内?跨度>
【解决方案2】:

你的问题有点令人困惑。

如果你的意思是你想要一个透明的窗口,上面有一个透明的 web 视图,上面有一些控件/按钮。这使得控件/按钮看起来是浮动的,并且能够在应用程序失去焦点的情况下单击看不见的窗口和 Web 视图,并且您在下面单击的任何内容都会成为活动应用程序。

如果您的意思是应用程序保持活动状态,但点击事件作用于透明窗口下方的任何内容。请参阅@WilShipley 的回答。

我刚刚测试并运行的这个例子。

1、在 AppDelegate 的 awakeFromNib 中将 webview 的 Alpha 设置为 0。

AppDelegate.m

//  AppDelegate.m
//  Transparent
//
//  Created by Mark Hunte on 19/01/2014.
//  Copyright (c) 2014 Mark Hunte. All rights reserved.
//

#import "AppDelegate.h"


@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

-(void)awakeFromNib{

    [_theWebView  setAlphaValue:0];

}
@end

2,子类化 NSWindow 使用:

[self setOpaque:NO]; [self setHasShadow:NO];

您可以选择 styleMask 以及您想要的任何其他选项。

这里我给了它一个标题栏。

*( 如果您不想要标题栏但想要移动它。您将不得不覆盖: - (BOOL)canBecomeKeyWindow 并使用: - (void)mouseDown:(NSEvent *)theEvent {
- (void)mouseDragged:(NSEvent )theEvent { 跟踪窗口的移动和位置。 )

MyWindow.h

    //
    //  MyWindow.h
    //
    //  Created by markhunte on 12/12/2010.
    //  Copyright 2010 __MyCompanyName__. All rights reserved.
    //

    #import <Cocoa/Cocoa.h>

    @interface MyWindow: NSWindow {



    }
        - (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag;

@end

MyWindow.m

//
//  MyWindow.m
//
//  Created by markhunte on 12/12/2010.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "MyWindow.h"

@implementation MyWindow

- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag {

        self = [super initWithContentRect:contentRect styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO];
        if (self)
        {

            [self setOpaque:NO];
            [self setHasShadow:NO];
        }
        return self;

}

@end

3,子类化 NSWindow 的 View 使用:

[[NSColor clearColor] set];

NSRectFill([self frame]);

在其- (void)drawRect:(NSRect)rect

MyView.h

//
//  MyView.h

//
//  Created by markhunte on 13/12/2010.
//  Copyright 2010 markosx.com. All rights reserved.
//

#import <Cocoa/Cocoa.h>


@interface MyView : NSView{

}
- (id)initWithFrame:(NSRect)frameRect;
- (void)drawRect:(NSRect)rect;

@end

MyView.m

//
//  MyView.m

//
//  Created by markhunte on 13/12/2010.
//  Copyright 2010 markosx.com. All rights reserved.
//

#import "MyView.h"

@implementation MyView

- (id)initWithFrame:(NSRect)frameRect
{
    self = [super initWithFrame:frameRect];
    return self;
}




- (void)drawRect:(NSRect)rect
{ 


         [[NSColor clearColor] set];
        NSRectFill([self frame]);


}

@end

在 IB 布局中,将 webview 连接为 IBOutlet,此处命名为 theWebView

我在布局中放置了一些标签,只是为了说明。

当运行窗口显示为:


我可以点击透明窗口的任何部分和 webview 到它后面的任何东西。


我已将源代码添加到我的博客The Cocoa Quest

【讨论】:

  • 谢谢!是否可以在 Dropbox 或任何存储服务上上传源代码?
  • @blez(只是注意到我错误地将这个评论放在另一个答案上,所以把它移到这里)我已经将我博客上的源代码链接更改为:markosx.com/thecocoaquest/…
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2016-04-06
相关资源
最近更新 更多