【问题标题】:Cocoa: change cursor when it's over an NSButtonCocoa:在 NSButton 上时更改光标
【发布时间】:2011-02-24 22:01:06
【问题描述】:

当光标位于 NSButton 上时如何更改光标?

【问题讨论】:

标签: cocoa nsbutton mouse-cursor


【解决方案1】:

让按钮添加一个光标矩形。

【讨论】:

  • 否决票是否必要?快速搜索“cursor rect”的文档会告诉你很多。
  • @JoshuaNozzi 是的,因为这本身并不是一个有用的答案。
  • @BenLeggiero 你对“有用”的定义很奇怪。鉴于查克的回答是正确的,但只是简短的,我认为投反对票有点过分。其他 SO'ers 可以选择写一个更好的答案或投票。但可以肯定的是,让我们惩罚帮助他人的企图。
  • @JoshuaNozzi 这是我的观点,其他人可能不会在 SO 上分享它:为了有用,答案应该独立存在。如果它与使用 API 相关,则应至少提供一个示例(在答案文本本身中)说明如何使用该 API。否则,它应该提供如何自己做的示例代码。恕我直言,这样的答案与发布 Google 搜索链接一样好。
  • @JoshuaNozzi 我只是通过网站范围的answering guidelines,上面写着“简洁是可以接受的,但更全面的解释更好”和“尝试提及任何限制、假设或简化”。
【解决方案2】:
[yourButton addCursorRect:[yourButton bounds] cursor:[theCursorYouWant]];

【讨论】:

  • 来自 Apple 文档:此方法只能由 resetCursorRects 方法调用。如果以任何其他方式调用,生成的光标矩形将在下次重建视图的光标矩形时被丢弃。所以你必须继承 NSButton。
【解决方案3】:

你应该先继承 NSButton,然后添加下面的代码。

- (void)resetCursorRects
{
    if (self.cursor) {
        [self addCursorRect:[self bounds] cursor: self.cursor];
    } else {
        [super resetCursorRects];
    }
}

现在你可以随意设置光标了。

[self.button setCursor:[NSCursor pointingHandCursor]];

注意:添加cursor 作为子类的属性,如下所示:

@property (strong) NSCursor *cursor;  

【讨论】:

  • 您能否扩展一下您的答案。 NSButton 没有光标实例变量?我不明白你的回答。
  • 子类化我在 UI 中的每个按钮只是为了应用悬停光标似乎不合理。在告诉你不应该直接调用 addCursorRect 之后,文档还告诉你永远不要直接调用“resetCursorRects”,而只能调用“invalidateCursorRects”,这是一个 NSWindow 方法。
  • @MottiShneor 在 -resetCursorRects 中调用 [super resetCursorRects] 本身并不违反“从不调用此”规则,因为无论如何您并没有真正调用它。
  • @MottiShneor 当然,你只会继承一次子类,然后在任何你想要的行为处使用子类。
【解决方案4】:

按照已经给出的example,在Swift 5中创建一个NSButton的子类:

import AppKit

class Button: NSButton {
    override func resetCursorRects() {
        addCursorRect(bounds, cursor: .pointingHand)
    }
}

【讨论】:

  • 我建议在拨打addCursorRect(bounds, cursor: .pointingHand)之前先拨打super.resetCursorRects()
【解决方案5】:

如果 NSButton 在 macOS 中,swift 5:

import Cocoa 
class ViewController: NSViewController {

    @IBOutlet weak var titleBtn: NSButton!
        
     override func viewDidLoad() {
       titleBtn.addCursorRect(titleBtn.bounds, cursor: .pointingHand)
     }
}

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多