我放置了一个NSSearchField
并将其边框设置为none
,我发现清除按钮不可点击,也就是点击时没有响应。如果我再次设置边框,它工作正常。
我已经调试了几个小时,发现当我将边框设置为无时,文本编辑器的宽度将扩大并遮蔽(覆盖)清除按钮。
截屏
查看层次结构调试截图
重现步骤:
- 创建一个空的可可项目/应用程序
- 放置一个
NSSearchField
- 将边框设置为无
- 运行应用程序,填写搜索字段并尝试单击清除按钮
这是一个错误吗?还是打算这样做?
注:可可开发新手
我放置了一个NSSearchField
并将其边框设置为none
,我发现清除按钮不可点击,也就是点击时没有响应。如果我再次设置边框,它工作正常。
我已经调试了几个小时,发现当我将边框设置为无时,文本编辑器的宽度将扩大并遮蔽(覆盖)清除按钮。
截屏
查看层次结构调试截图
重现步骤:
NSSearchField
这是一个错误吗?还是打算这样做?
注:可可开发新手
我遇到了这个问题,并将其视为 Cocoa 中的一个错误。但是在自定义控件或视图控制器中很容易修复。只需在界面生成器中保留文本字段的边界,然后通过拥有新的 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
}
}
如您所见,我只是在新图层中恢复控制颜色,而不保留任何其他内容。它并不完美,但至少提供了良好的开端。
julia_v 的回答几乎是正确的。您还应该从 rect.origin.x 中删除 searchButtonWidth 以将 rect 向后偏移。
而且我还添加了更多逻辑来仅在需要时制作这些“技巧”。
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 实例。
在代码中创建的 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];
}
此方法在鼠标单击字段的文本区域后调用。它似乎也是设置插入点颜色的好地方。