我有一个简单的自定义无边框 NSWindow 子类,它具有圆角矩形形状。
在这个窗口的内容视图中,我添加了一个 NSScrollView。
如何让 NSScrollView 将其文档视图剪辑到 NSWindow 的圆角矩形形状?
我已经尝试子类化 NSScrollView,覆盖 drawRect: 并在调用 super 之前添加一个剪切路径。我还尝试使用相同的技术对文档视图和剪辑视图进行子类化,但我无法将其剪辑。
顺便说一句,这是在具有弹性滚动行为的 Lion 上。
我是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之前只有基于单元格的表格?
我们有一个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.png并button@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.
我正在尝试在(半)透明背景上使用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获得的相同结果吗?
我正在为包含多个子视图的图层支持视图设置动画。一切都使用自动布局进行布局。目前,当我为视图设置动画时,子视图不会随之缩放:

我希望将整个事物绘制一次,以它们的最终尺寸绘制,然后在动画播放时进行缩放。该layerContentsPlacement和layerContentsRedrawPolicy性能似乎是什么我正在寻找,但改变他们似乎没有任何效果。
这是我如何制作动画的基本流程:
// 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) 显示上下文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应用程序中绘制该颜色时,我得到的结果颜色与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显示配置文件完全匹配?
我有一个NSPopover的NSComboBox子项.弹出窗口是瞬态的,并配置为当用户在其边界外单击时关闭.
当其组合框弹出窗口处于活动状态并显示时,当用户按下弹出窗口拥有视图时,视图会按预期接收鼠标,弹出框消失,组合框解除,但视图从未接收到下一个mouseUp.
事实证明,NSComboBoxCell的trackMouse方法(跟踪循环)在收到mouseUp之前不会返回,但与mouseDown的情况不同,它将它很好地重新分配到被点击的视图,它从不传播mouseUp.
我不得不使用以下NSComboBoxCell trackMouse覆盖来解决此问题.
有没有人事先看过这个问题或了解可能发生的事情?
--------
- (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) 我想显示一个NSPopover跟踪用户鼠标光标的信息.
为此,我使用an NSTrackingArea来positioningRect在mouseMoved事件触发时更新popover .
但是,这有两个缺点:
mouseExited会调用跟踪区域的方法,这会导致弹出窗口"吸收"鼠标移动事件,从而mouseMoved不再触发跟踪区域的事件.如何避免弹出窗口吸收鼠标事件,或者至少保持转发这些事件?这个问题非常类似于围绕这个NSTrackingArea怪癖的任何方式?,由于我正在使用的区别NSPopover,所以我没有什么可以继续ignoresMouseEvents下去.
大多数问题以及与此相关的答案均基于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 ×10
cocoa ×8
macos ×3
animation ×1
autolayout ×1
core-text ×1
ibdesignable ×1
nscell ×1
nscolorspace ×1
nsmenu ×1
nspopover ×1
nstableview ×1
nswindow ×1
objective-c ×1
osx-lion ×1
swift4 ×1
xcode ×1
xcode9.2 ×1