标签: appkit

如何以固定宽度获取NSAttributedString的高度

我想在固定宽度的框中绘制一些NSAttributedStrings,但是在计算绘制它们时会占用的正确高度时遇到问题.到目前为止,我已经尝试过:

  1. 调用- (NSSize) size,但结果是无用的(为此目的),因为他们会给出字符串所需的宽度.

  2. - (void)drawWithRect:(NSRect)rect options:(NSStringDrawingOptions)options使用矩形调用我想要的宽度和NSStringDrawingUsesLineFragmentOrigin选项,就像我在绘图中使用的那样.结果......难以理解; 当然不是我想要的.(正如许多地方所指出的,包括这个 Cocoa-Dev线程).

  3. 创建一个临时的NSTextView并执行: 当我查询tmpView的框架时,宽度仍然是所需的,并且高度通常是正确的......直到我得到更长的字符串,当它通常是所需尺寸的一半时.(似乎没有最大尺寸被击中:一帧将是273.0高(约300太短),另一帧将是478.0(只有60-ish太短)).
    [[tmpView textStorage] setAttributedString:aString];
    [tmpView setHorizontallyResizable:NO];
    [tmpView sizeToFit];

如果有人管理过这个,我会感激任何指点.

cocoa nstextview nsattributedstring appkit

48
推荐指数
4
解决办法
3万
查看次数

无边框NSButton在单击时变为灰色

我正在用一个带有图像集的三个NSButton做一个小应用程序.这些按钮没有边框也没有背景.但是,当我单击一个按钮时,它变成一个灰色矩形.

我怎样才能解决这个问题?谢谢.

user-interface cocoa interface-builder appkit nsbutton

31
推荐指数
2
解决办法
1万
查看次数

添加Subview到NSWindow Titlebar

我想创建一个自定义的窗口工具栏,但不使用实际的NSToolbar(因为它在某些情况下不能满足我的需要而且我不能按照我想要的方式设置它),因此我需要添加子视图到窗口标题栏.它应该如下所示:自定义工具栏的屏幕截图

一种可行的方式是:

[[[_window contentView] superview] addSubview:_titlebarView];
Run Code Online (Sandbox Code Playgroud)

但这有问题,它会在Yosemite(NSWindow warning: adding an unknown subview: <NSView: 0x608000122b20>)上引发警告,所以这似乎不是正确的方法.

目前我将工具栏视图添加到标题栏视图:

[[[_window standardWindowButton:NSWindowCloseButton]
    superview] addSubview:_titlebarView];
Run Code Online (Sandbox Code Playgroud)

但这也错了.

由于我的应用程序仅针对OS X 10.10(Yosemite),因此我可以使用仅限Yosemite的API,所以我看了一下,NSTitlebarAccessoryViewController并设法成功地将其子类化并使用它NSWindowaddTitlebarAccessoryViewController:方法.使用这种方法仍然存在一个问题,可能的值layoutAttribute是:

  • NSLayoutAttributeBottom
    将视图添加到窗口标题栏的底部,同时保留视图的高度.
  • NSLayoutAttributeRight
    将视图添加到窗口标题栏的右侧,将视图剪切到标题栏的高度.

NSLayoutAttributeBottom不适合我,因为我需要在窗口标题栏的顶部放置一些东西(见上面的截图)并将红绿灯居中. NSLayoutAttributeRight将是我所需要的,但我找不到增加标题栏高度的方法,因此视图被剪切到标题栏高度,这对我来说毫无用处.(注意:使用带纹理的窗口并更改内容边框不起作用,因为它不会更改实际的标题栏高度)

建议的方法是什么?我更愿意使用官方API并使用AccessoryViewController方法,如果可能有一个大于默认标题栏的视图.

cocoa objective-c appkit osx-yosemite nstitlebaraccessoryviewcontroller

27
推荐指数
2
解决办法
5468
查看次数

如何使用默认URL方案处理

我想在我的应用程序中构建URI(或URL方案)支持.

LSSetDefaultHandlerForURLScheme()在我的工作中+ (void)initialize也设置了特定的URL方案info.plist.所以我没有Apple Script或没有URL方案Apple Events.

当我myScheme:在我最喜欢的浏览器中调用时,系统会激活我的应用程序.

问题是,如何在调用方案时处理这些方案.或者更好地说:如何定义应用程序应该执行的操作,何时myScheme:调用.

有一种特殊的方法我必须实现或者我必须在某处注册吗?

macos cocoa url-scheme appkit

23
推荐指数
3
解决办法
2万
查看次数

NSEvent全局事件监控在后台进行

我正在编写一个简单的Mac应用程序,旨在在后台运行并在用户单击鼠标按钮时执行某些操作.该应用程序是使用PyObjC用Python编写的.我addGlobalMonitorForEventsMatchingMask用来观看NSLeftMouseDown比赛:

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)
Run Code Online (Sandbox Code Playgroud)

在终端中运行时,此代码非常有效.但是,当我将其捆绑为独立应用程序(使用py2app)然后启动它时,应用程序最初不会收到任何事件.(或者至少,如果确实如此,它不会在我的处理程序方法中运行代码.)只有当我点击Dock中的应用程序时它才开始接收事件,之后,它继续接收事件,甚至在它之后返回后台.但是直到激活一次它才会收到任何东西.

我的问题是:如何让我的应用程序在启动后立即开始接收事件,而无需先通过单击Dock图标来激活它?这是一些已知的怪癖NSEvents,或者在PyObjC中我的运行循环可能有问题吗?

非常感谢任何帮助或指导!

编辑:经过进一步测试,事实上,我的应用程序似乎在发布后大约十秒钟内自动开始接收通知,无论我是否激活它.这有点烦人,但很好.

但是,如果我使用其中任何一个LSUIElement = trueLSBackgroundOnly = true我的Info.plist(我最终想要做的,因为这个应用程序应该只在后台运行并且永远不会出现在Dock中)运行应用程序,我从未收到通知.所以我仍然被困住了.

python macos cocoa pyobjc appkit

23
推荐指数
1
解决办法
1113
查看次数

允许单击并拖动视图以拖动窗口本身?

我正在使用一个带纹理的窗口,它的顶部有一个标签栏,位于标题栏的下方.

我已经-setContentBorderThickness:forEdge:在窗口上使用了渐变效果,并确保纸张从正确的位置滑出.

然而,什么不起作用是拖动窗口.如果我点击并拖动实际上是标题栏的区域,但是由于标题栏渐变溢出到(可能/通常是空的)标签栏,它容易点击太低而且当你试图拖动时感觉非常令人沮丧并意识到窗户没有移动.

我注意到NSToolbar,当标题栏下方占据的空间大致相同时,允许在光标位于其上时拖动窗口.如何实现这一点?

谢谢.

标签栏

macos cocoa objective-c appkit nswindow

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

除非编辑,否则不会显示NSTextField占位符文本

我在Interface Builder中设置了我的NSTextField的占位符文本,但是在我在文本字段内单击以编辑它之前,占位符文本不会显示.还有谁有相同的问题吗?

谢谢

编辑:截图.当我不编辑它时,这是该字段的样子:

不编辑http://cl.ly/2a0R1h1p2A082g1t1b3q/Screen_Shot_2011-04-01_at_6.51.25_PM.png

这就是我编辑时的样子:

编辑http://cl.ly/1c2d1U233R3j3k0M2E2Q/Screen_Shot_2011-04-01_at_6.51.32_PM.png

macos cocoa objective-c nstextfield appkit

16
推荐指数
2
解决办法
1万
查看次数

在AppKit中开发时,为什么IB会创建一个赋值的属性,而不是保留?

我是一名经验丰富的iOS开发者,我决定尝试一些AppKit开发.我正在进行一些API调整,但是否则我发现OS X开发是"熟悉的".

我一直在Interface Builder中构建我的AppKit UI,并注意到当我使用WYSIWYG编辑器在我的代码文件中创建属性时,Apple正在创建以下内容:

@property (assign) IBOutlet NSTableView *tableView;
Run Code Online (Sandbox Code Playgroud)

我发现这很奇怪,因为iOS中默认的做事方式会让我这样做:

@property (nonatomic, retain) IBOutlet NSTableView *tableView;
Run Code Online (Sandbox Code Playgroud)

我意识到在Mac开发中我没有与移动设备相同的内存限制,视图可以卸载,并且可能需要对UI元素进行强引用.

在AppKit的情况下,我可以很好地假设我的UI元素将始终存在,除非我摆弄视图层次结构并将其从父视图中删除.在任何时候都有一个强有力的参考,以防止无意中访问悬空指针似乎是明智的.

为什么Apple会在这里创建一个弱引用,而不是强大的引用呢?

我是否通过使用强引用(但正确释放dealloc)为自己设置了一些意想不到的后果?这里有一些我错过的模式吗?

memory-management objective-c appkit

16
推荐指数
1
解决办法
946
查看次数

你如何在NSWindow上使用黑暗的活力?

使用Vibrant Dark(NSAppearanceNameVibrantDark)或Vibrant Light(NSAppearanceNameVibrantLight)模式的正确方法是NSWindow什么?

我正在构建一个应用程序,并希望提供新的Vibrant Dark外观作为主应用程序的选项NSWindow.窗口本身是一个非常直接的窗口,NSToolbar顶部和滚动视图作为主要内容区域.

苹果公司提供了大量关于使用新的活力外观和a的信息NSVisualEffectsView,但我正在寻找关于如何使用这些外观的澄清NSWindow.

NSAppearance.h头文件中,有一条注释声明应该只在一个上设置生动的外观NSVisualEffectsView.没有提到它得到支持NSWindow.

WWDC视频谈论确保您使用图层支持的视图,并且在使用新的充满活力的外观时允许您的子视图充满活力,但同样,没有提及使用它们NSWindow.

VisualEffectsPlayground示例代码确实有一个类似Facetime的应用程序的示例,它使用暗光振动模式,但它没有工具栏,它使用全内容掩码.

根据该信息,我在我的NSWindowController's windowDidLoad方法中执行以下操作:

[self.window.contentView setWantsLayer:YES];
self.window.appearance = [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark];
Run Code Online (Sandbox Code Playgroud)

而且,果然,我得到一个NSToolbar带有黑色窗口标题栏的黑色.因此看起来它正常工作,但是当我的滚动视图滚动其内容(图像的缩略图)时NSToolbar,窗口标题栏下的标准半透明要么不存在,要么随机出现.似乎没有任何模式.有时当我滚动滚动视图时,内容在工具栏和标题栏下以"模糊"状态显示.其他时候滚动时,工具栏和标题栏只是一个不透明的黑色.(标题栏和工具栏仍然绘制其标题和按钮.)

当我没有为窗口的内容视图请求图层时,我得到的是更多的灰色标题栏和窗口标题,而不是"纯"的黑色标题栏.(我的scrollview的背景颜色可以是白色,深灰色或黑色.)

任何帮助或澄清如何正确配置NSWindow(包含NSToolbar和一个NSScollView)使用新的活力外观将非常感激.

cocoa objective-c appkit nswindow osx-yosemite

16
推荐指数
1
解决办法
7327
查看次数

如何以编程方式调用NSScrollView autoscroll-method

我有简单的聊天应用程序和基于文本消息视图的NSTableView,如下图所示. 在此输入图像描述 每条消息都包含NSTextView实例,其高度适合所有文本.

我需要的是启动NSScrollView(其中包含NSTableView实例)自动滚动,同时用户选择文本拖动鼠标足够远.不幸的是,自动滚动没有出现.如果拖动文本视图之外的某个地方都成功.

我试图autoscroll:通过简单地NSEventNSTextView-subclass"鼠标拖动"-event中推送-instance来直接调用-method (就像本文中的示例一样):

- (void)mouseDragged:(NSEvent *)event
{
  [self.scrollView autoscroll:event];
}
Run Code Online (Sandbox Code Playgroud)

由于我已经覆盖了所有鼠标事件并实现了所有文本选择,因此这种方法经常会调用.但是自动滚动似乎不起作用.

UPDATE

我发现在调用-autoscroll:-method 之前必须有-mouseDown:相同的对象.但它打破了我的文本选择机制.这一点甚至不是第一响应者,除了mouseDown:-method之外必须有其他东西.

macos cocoa appkit nsscrollview autoscroll

16
推荐指数
1
解决办法
1225
查看次数