标签: appkit

在 NSScrollView 上剪切圆角

我有一个简单的自定义无边框 NSWindow 子类,它具有圆角矩形形状。

在这个窗口的内容视图中,我添加了一个 NSScrollView。

如何让 NSScrollView 将其文档视图剪辑到 NSWindow 的圆角矩形形状?

我已经尝试子类化 NSScrollView,覆盖 drawRect: 并在调用 super 之前添加一个剪切路径。我还尝试使用相同的技术对文档视图和剪辑视图进行子类化,但我无法将其剪辑。

顺便说一句,这是在具有弹性滚动行为的 Lion 上。

cocoa appkit osx-lion

5
推荐指数
1
解决办法
1852
查看次数

tableView:viewForTableColumn:row:未调用

我是AppKit的新手,但不是UIKit.
我尝试使用一个NSTableView,我想以编程方式填充.

所以我实施了

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return 1;
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

我将我的类设置为Interface Builder中的委托和数据源.
numberOfRowsInTableView被调用但tableView:viewForTableColumn:row:未被调用.

如果我加

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex{
    return @"toto";
}
Run Code Online (Sandbox Code Playgroud)

这个被称为.

如果我理解,tableView:viewForTableColumn:row:则调用基于视图的表,tableView:objectValueForTableColumn:row:并调用基于单元格的表.

如何定义我的表是基于视图的?

编辑: 好的...所以问题是我使用10.6和tableView:viewForTableColumn:row:从10.7开始可用.所以它意味着在10.7之前只有基于单元格的表格?

cocoa nstableview appkit

5
推荐指数
1
解决办法
4358
查看次数

WebView的COMBINE_HIDPI_IMAGES和Retina图形

我们有一个Xcode项目,包括用于基于NIB的UI的Retina图形和WebView UI.该项目为Mac构建了一个应用程序.

该项目使用两个单独的构建阶段将这些图形移动到最终应用程序中.第一种是传统的Copy Bundle Resource,它将1x和2x图形都集成到应用程序包中.第二个是复制文件构建阶段,它将Web图形复制到具有"图形"子路径的单独的资源目标中.

(这避免了一些命名冲突,让网页设计师使用熟悉的"graphics/whatever.png"路径.)

构建此项目时,我们会得到一个依赖性分析错误,该错误表示:

复制文件构建阶段无法处理多表示图像'whatever@2x.png' - 尝试复制资源构建阶段,或禁用COMBINE_HIDPI_IMAGES.

关闭名为"组合高分辨率图稿"的部署构建设置很容易,但这会影响基于NIB的UI以及WebView UI中使用的图形.随着选项打开,button.pngbutton@2x.png共同结合成一个button.tiff应用程序包的资源文件夹中.没有它,使用原始名称.

据我所知,应用程序运行正常,但由于COMBINE_HIDPI_IMAGES默认设置为开启,我怀疑将图形部署为单个文件有一些好处(可能更快加载和缓存).

理想情况下,我只想在复制文件构建阶段禁用COMBINE_HIDPI_IMAGES.我无法想办法做到这一点,希望这里的其他人可以......

2012年8月27日更新

对于此特定应用程序,解决此问题的最简单方法是使用2x版本替换所有HTML图像.由于标签指定宽度和高度,因此在非Retina设备上图像按比例缩小50%.质量很好,因为它们是从本地文件系统加载的,所以没有可察觉的性能影响.

2012年8月28日更新

我们采用的另一种方法是使用命名约定.一些HTML图像是使用CSS指定的(媒体查询选择Retina或非Retina版本.)为了避免将这些图像组合成单个HiDPI图像的问题,我们使用whatever.png和whatever_retina.png.

macos xcode appkit retina-display

5
推荐指数
1
解决办法
2584
查看次数

CoreText字体在透明背景上平滑

我正在尝试在(半)透明背景上使用CoreText(appkit版本)进行渲染,因此边缘不平滑.

在网上搜索表明没有解决这个问题的方法,但是我不相信它,因为一个简单的观察:如果我创建一个包含相同字符串的CATextLayer,那么字体是可爱和流畅的.

我已经尝试将各种"允许"设置设置为true,然后完成它们提供的16种可能性.有些人比其他人好,这是我到目前为止所做的:

        CGContextSetAllowsAntialiasing(context, YES);
        CGContextSetAllowsFontSmoothing(context, YES);
        CGContextSetAllowsFontSubpixelPositioning(context, YES);
        CGContextSetAllowsFontSubpixelQuantization(context, YES);

        CGContextSetShouldAntialias(context, YES);
        CGContextSetShouldSmoothFonts(context, NO);
        CGContextSetShouldSubpixelPositionFonts(context, YES);
        CGContextSetShouldSubpixelQuantizeFonts(context, YES);
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何获得CATextLayer获得的相同结果吗?

cocoa appkit core-text

5
推荐指数
0
解决办法
425
查看次数

动画图层支持视图时缩放图层内容

我正在为包含多个子视图的图层支持视图设置动画。一切都使用自动布局进行布局。目前,当我为视图设置动画时,子视图不会随之缩放:

动画片

我希望将整个事物绘制一次,以它们的最终尺寸绘制,然后在动画播放时进行缩放。该layerContentsPlacementlayerContentsRedrawPolicy性能似乎是什么我正在寻找,但改变他们似乎没有任何效果。

这是我如何制作动画的基本流程:

// Add itemView to canvas
NSView *itemView = // ...
itemView.layerContentsPlacement = NSViewLayerContentsPlacementScaleProportionallyToFit;
itemView.layerContentsRedrawPolicy = NSViewLayerContentsRedrawBeforeViewResize;
[parentView addSubview:itemView];

// Add constraints for the final itemView frame ...

// Layout at final state
[parentView layoutSubtreeIfNeeded];

// Set initial animation state
itemView.alphaValue = 0.0f;
itemView.frame = // centered zero'ed frame

// Set final animation state
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
  context.duration = 0.25f;
  context.allowsImplicitAnimation = YES;

  itemView.alphaValue = 1.0f;
  [parentView layoutSubtreeIfNeeded];
} completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

cocoa animation core-animation appkit autolayout

5
推荐指数
1
解决办法
1078
查看次数

在不阻塞主线程的情况下显示上下文 NSMenu

显示上下文NSMenu. 我提出了自己的菜单,不使用menu的特性NSResponder。原来,呈现一个NSMenu是一个阻塞操作。

在一个新的模板项目中,我只添加了以下代码 applicationDidLaunch:

NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Menu"];
[menu addItemWithTitle:@"Item 1" action:@selector(selected:) keyEquivalent:@""];
[menu addItemWithTitle:@"Item 2" action:@selector(selected:) keyEquivalent:@""];
[menu addItemWithTitle:@"Item 3" action:@selector(selected:) keyEquivalent:@""];
[menu popUpMenuPositioningItem:[menu itemAtIndex:0] 
                    atLocation:CGPointMake(500, 500) 
                        inView:nil];
NSLog(@"Context menu shown.");
Run Code Online (Sandbox Code Playgroud)

popUpMenuPositioningItem:atLocation:inView:我选择一个项目或单击外部以自动关闭菜单之前,呼叫不会返回。仅在关闭菜单后才会打印日志。

为什么会发生这种情况?我该如何预防?我发现了一些关于这个问题的提及,但“解决方案”总是包括在后台执行其他事情,而不是阻止NSMenu阻塞。

编辑:

如果我在后台线程中显示菜单,菜单将变得无响应,对内部或外部的点击没有反应。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    [[menu popUpMenuPositioningItem:[menu itemAtIndex:0] 
                         atLocation:CGPointMake(500, 500) 
                             inView:nil];
});
Run Code Online (Sandbox Code Playgroud)

cocoa multithreading objective-c nsmenu appkit

5
推荐指数
1
解决办法
1662
查看次数

如何让我的Cocoa应用程序精确绘制我的设计师在Sketch中指定的颜色?

我的设计师指定了要绘制的颜色.当我尝试在Cocoa应用程序中绘制该颜色时,我得到的结果颜色与Sketch.app显示的参考图像明显不同.

我制作了一个小型Cocoa应用程序,可以绘制自定义视图.这是代码中有趣的部分.请注意,我正在初始化SRGB空间中的颜色.

class View: NSView {
    override func drawRect(dirtyRect: NSRect) {
        let components : [CGFloat] = [156.0/255.0, 0, 254.0/255.0, 1]
        let color = NSColor.init(SRGBRed: components[0], green: components[1], blue: components[2], alpha: components[3])
        color.setFill()
        NSRectFill(self.bounds)
    }    
}
Run Code Online (Sandbox Code Playgroud)

这是它绘制的内容.(没关系光标的部分.我删除了窗口阴影,这样就可以更容易地与其他窗口并排查看.)

在此输入图像描述

这是Sketch文件部分:

在此输入图像描述

将它们放在一起,这里是Sketch文件和自定义视图的并排,以及显示鼠标光标下的颜色值的Xscope放大镜.

将鼠标悬停在Sketch文件上时,我看到:

在此输入图像描述

将鼠标悬停在我的自定义视图上时,我会看到:

在此输入图像描述

您可以看到Xscope读取的黑色鼠标光标下的像素颜色值明显不同.我的Retina Macbook Pro显示器的颜色也有很大不同,但有趣的是,在捕获的屏幕截图PNG中没有那么不同.

但是:到目前为止,这一切都是通过默认显示设置和颜色配置文件"Color LCD"完成的(硬件是Retina Macbook Pro及其内置显示屏).当我在OSX设置应用程序中手动将显示配置文件更改为"sRGB IEC61966-2.1",然后使用Xscope再次采样颜色时,您可以看到这些采样值:

在此输入图像描述

在对自定义视图进行采样时:

在此输入图像描述

最有趣的是,您可以看到Xscope在我的自定义视图上采样的值与指定的值完全匹配,并且颜色在视觉上也是正确的.但是,当然,我不能让我的用户更改他们的显示配置文件.

我的问题:如何使我的自定义视图颜色与Sketch中的颜色(用于目视检查和使用Xscope放大镜采样时)与默认的彩色LCD显示配置文件完全匹配?

cocoa appkit nscolorspace

5
推荐指数
1
解决办法
670
查看次数

NSComboBoxCell吃mouseUp事件

我有一个NSPopover的NSComboBox子项.弹出窗口是瞬态的,并配置为当用户在其边界外单击时关闭.

当其组合框弹出窗口处于活动状态并显示时,当用户按下弹出窗口拥有视图​​时,视图会按预期接收鼠标,弹出框消失,组合框解除,但视图从未接收到下一个mouseUp.

事实证明,NSComboBoxCell的trackMouse方法(跟踪循环)在收到mouseUp之前不会返回,但与mouseDown的情况不同,它将它很好地重新分配到被点击的视图,它从不传播mouseUp.

我不得不使用以下NSComboBoxCell tr​​ackMouse覆盖来解决此问题.

有没有人事先看过这个问题或了解可能发生的事情?

--------

- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame
            ofView:(NSView *)controlView untilMouseUp:(BOOL)untilMouseUp {

    BOOL trackingResult = [super trackMouse:theEvent inRect:cellFrame
        ofView:controlView untilMouseUp:untilMouseUp];

    // If we were dismissed due to mouse event and the current
    // event (that NSComboBoxCell is currently eating), just redispatch
    // it so it lands with its intended destination.
    if (trackingResult) {
        NSEvent* currentEvent = [NSApp currentEvent];
        if (currentEvent.type == NSLeftMouseUp && currentEvent.window != nil) {
            [NSApp postEvent:currentEvent atStart:YES];
        }
    }

    return trackingResult;
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa appkit nscell

5
推荐指数
0
解决办法
79
查看次数

如何使NSPopover正确地按照鼠标指针并忽略鼠标事件?

我想显示一个NSPopover跟踪用户鼠标光标的信息.

为此,我使用an NSTrackingAreapositioningRectmouseMoved事件触发时更新popover .

但是,这有两个缺点:

  1. popover跟随鼠标略有延迟.如何减少此延迟以使弹出窗口更加"粘在"鼠标指针上?
  2. 当我沿着弹出方向移动鼠标指针时,mouseExited会调用跟踪区域的方法,这会导致弹出窗口"吸收"鼠标移动事件,从而mouseMoved不再触发跟踪区域的事件.如何避免弹出窗口吸收鼠标事件,或者至少保持转发这些事件?

这个问题非常类似于围绕这个NSTrackingArea怪癖的任何方式?,由于我正在使用的区别NSPopover,所以我没有什么可以继续ignoresMouseEvents下去.

macos cocoa appkit nswindow nspopover

5
推荐指数
1
解决办法
637
查看次数

在Xcode 9.2和Swift 4中,AppDes是否破坏了IBDesignable?

大多数问题以及与此相关的答案均基于Xcode和Swift的旧版本.此外,90%的问题与UIKit和绘制自定义控件有关.

我正在添加一个标准按钮,它位于一个自定义控件内部,用IBDesignable.

import Cocoa

@IBDesignable public class ButtonPresetView: NSView {
    public override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        initialControlSetup()
    }

    public required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        initialControlSetup()
    }

    private func initialControlSetup() {
        let button = NSButton(title: "Hello", target: nil, action: nil)
        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)

        // Configure button
        centerXAnchor.constraint(equalTo: button.centerXAnchor).isActive = true
        centerYAnchor.constraint(equalTo: button.centerYAnchor).isActive = true
    }
}
Run Code Online (Sandbox Code Playgroud)

我向应用程序添加了一个自定义视图,并将Identity Inspector中的class属性设置为我的自定义类(ButtonPresetView).

它应该显示以画布为中心的按钮,但画布为空白.不确定很多人会这样使用它,但它在Xcode 8.3中使用Swift 3非常有效.

还有其他人有这个问题吗?

appkit ibdesignable swift4 xcode9.2

5
推荐指数
1
解决办法
681
查看次数