【问题标题】:How to create inner transparent nsview with nonopaque window如何使用非透明窗口创建内部透明 nsview
【发布时间】:2018-08-12 00:42:42
【问题描述】:

我正在尝试在非透明窗口中创建不透明边框。目前我寻找子视图并创建 bezierpath 来填充外部区域。有没有其他方法可以做到这一点?

例如我想要达到的目标:

#import "MyView2.h"
#import "MyView.h"

@interface MyView2() {
    NSRect transparentSubviewRect;
}

@end

@implementation MyView2

- (void)awakeFromNib
{
    NSArray *subviews = [self subviews];
    for (NSView *view in subviews) {
        if ([view isKindOfClass:[MyView class]]) {
            transparentSubviewRect = [view frame];
        }
    }
}

- (void)drawRect:(NSRect)dirtyRect {
    NSRect rect = [self frame];
    NSBezierPath *path = [NSBezierPath bezierPath];
    [path moveToPoint:NSMakePoint(NSMaxX(transparentSubviewRect), NSMaxY(transparentSubviewRect))];
    [path lineToPoint:NSMakePoint(NSMinX(transparentSubviewRect), NSMaxY(transparentSubviewRect))];
    [path lineToPoint:NSMakePoint(NSMinX(transparentSubviewRect), NSMinY(transparentSubviewRect))];
    [path lineToPoint:NSMakePoint(NSMaxX(transparentSubviewRect), NSMinY(transparentSubviewRect))];
    [path lineToPoint:NSMakePoint(NSMaxX(transparentSubviewRect), NSMaxY(transparentSubviewRect))];
    [path closePath];
    [path moveToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))];
    [path curveToPoint: NSMakePoint(NSMaxX(rect), NSMinY(rect))
               controlPoint1: NSMakePoint(NSMaxX(transparentSubviewRect), NSMaxY(transparentSubviewRect))
               controlPoint2: NSMakePoint(NSMaxX(rect), NSMinY(transparentSubviewRect))];
    [path lineToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect))];
    [path lineToPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect))];
    [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))];
    [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))];
    [path closePath];
    [[NSColor windowBackgroundColor] setFill];
    [path fill];
}

@end

#import "MyWindow.h"

@implementation MyWindow


- (BOOL)isOpaque
{
    return NO;
}

- (NSColor *)backgroundColor
{
    return [NSColor colorWithCalibratedWhite:0.0 alpha:0.3];
}

@end

【问题讨论】:

    标签: macos cocoa nsview


    【解决方案1】:

    更简单的解决方案是填充整个视图并使用 NSCompositingOperationClear 操作。强制是不透明的窗口+窗口的一些透明背景颜色。

    - (void)drawRect:(NSRect)dirtyRect {
        [[NSColor windowBackgroundColor] setFill];
        NSRectFill([self bounds]);
        NSRectFillUsingOperation(transparentSubviewRect, NSCompositingOperationClear);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2010-10-21
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多