OSX可可NSSearchField清除按钮没有响应点击
我放置一个NSSearchField
并将其边框设置为none
,我发现清除按钮不可点击a.k.a.点击时没有响应。如果我再次设置边框,它工作正常。OSX可可NSSearchField清除按钮没有响应点击
我已经调试这几个小时,并发现,当我边框设置为无,文本编辑器的宽度将扩大和阴影(盖)清除按钮。
截图
查看层次调试截图
重现步骤:
- 创建一个空的可可项目/应用
- 放置一个
NSSearchField
- 设置边框无
- 运行应用程序,填补了搜索领域,并尝试点击清除按钮
这是一个错误?或者它是否打算这样做?
注:新手可可开发
我面对这个问题,并认为它是可可的错误。但是在自定义控件或视图控制器中很容易修复。只要保持界面构建器中的文本字段的边界,然后通过拥有新的CALayer来杀死边界。例如:
class ViewController: NSViewController {
@IBOutlet weak var searchField: NSSearchField!
override func viewDidLoad() {
super.viewDidLoad()
let maskLayer = CALayer()
searchField.layer = maskLayer
maskLayer.backgroundColor = searchField.backgroundColor?.CGColor
}
}
正如你所看到的,我只是在新层中恢复控制颜色而不保留其他任何东西。这并不完美,但至少可以带来好的开始。
在代码中创建的NSSearchField中有相同的问题。通过在子类中重写NSSearchFieldCell方法解决它:
- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
{
NSRect newRect = aRect;
newRect.size.width -= (NSWidth([self searchButtonRectForBounds:aRect]) + NSWidth([self cancelButtonRectForBounds:aRect]));
[super selectWithFrame:newRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
}
这种方法是在球场上的文本区域中鼠标点击后调用。它似乎也是设置插入点颜色的好地方。
此解决方案的问题是,如果Apple修复了selectWithFrame中的错误,那么您将传递比您应该做的更小的矩形,并且搜索字段太小。 Eugene的解决方案是插入一个隐藏边界的图层,当bug修复时不太可能产生任何负面影响。 – tarmes
julia_v's answer几乎是正确的。您还应该从rect.origin.x中删除searchButtonWidth以将回调抵消掉。
而且我还增加了一些逻辑,只在需要时才制作这些“技巧”。
override func select(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, start selStart: Int, length selLength: Int) {
var newRect = rect
if !isBordered || isBezeled {
let cancelButtonWidth = NSWidth(cancelButtonRect(forBounds: rect))
let searchButtonWidth = NSWidth(searchButtonRect(forBounds: rect))
newRect.size.width -= (cancelButtonWidth + searchButtonWidth)
newRect.origin.x += searchButtonWidth
}
super.select(withFrame: newRect, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
}
创建子后只需将其设置为在IB身份检查NSSearchFieldCell实例。
谢谢,这个伎俩! –