0

如何在需要时更新 NSCursor?我实现了resetCursorRects方法。在resetCursorRects我创建具有所需大小的图像(大小取决于我的应用程序中的滑块值)并使用该图像制作光标。因此,如果我的滑块(女巫声明所需的光标大小)正在更改,我需要更新我的光标。因此,如果从逻辑上思考,呼叫[self resetCursorRects]应该有效,但事实并非如此。更改滑块值并调整窗口大小后,光标会更新。但是为什么当我尝试调用它时它没有更新?

4

2 回答 2

3

如果您只想要一个更简单的解决方案,仅使用系统游标,您可以这样做:

在视图头文件中声明:

NSCursor *currentCursor;

实现这个方法:

- (void)resetCursorRects
{
    NSSize clientSize = self.frame.size;
    NSRect clientArea = {0, 0, clientSize.width, clientSize.height};
    [self addCursorRect:clientArea cursor:currentCursor];
}

只需执行此操作即可更改光标:

currentCursor = [NSCursor arrowCursor];
[self discardCursorRects];
[currentCursor set];

或者使用任何其他系统定义的游标。

于 2013-11-11T20:36:19.527 回答
1

为此,您应该实施

@property (nonatomic, retain) NSArray *cursors;

在您的 .h 文件中,例如:

- (void)loadCursors
{
    NSCursor *defaultCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:DEFAULT_CURSOR] hotSpot:NSMakePoint(2, 0)];
    NSAssert(defaultCursor, @"defaultCursor failed to load");
    NSCursor *clickedCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:CLICKED_CURSOR] hotSpot:NSMakePoint(2, 0)];
    NSAssert(clickedCursor, @"clickedCursor failed to load");
    NSCursor *draggingCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:DRAGGING_CURSOR] hotSpot:NSMakePoint(17, 2)];
    NSAssert(draggingCursor, @"draggingCursor failed to load");

    self.cursors = [NSArray arrayWithObjects:defaultCursor, clickedCursor, draggingCursor, nil];

    [defaultCursor release];
    [clickedCursor release];
    [draggingCursor release];

    [self resetCursorRects];
}

- (void)setCursor:(NSUInteger)cursorIndex
{
    [self discardCursorRects];

    [self addCursorRect:self.bounds cursor:[self.cursors objectAtIndex:cursorIndex]];
    [(NSCursor *)([self.cursors objectAtIndex:cursorIndex]) set];
}

- (void)resetCursorRects
{
    [self setCursor:CursorTypeDefault];
}

并在以下情况下使用这些方法:

- (void)mouseDown:(NSEvent *)theEvent
{    
    [self setCursor:CursorTypeClicked];
}

或任何你想要的地方。

不要忘记使用游标实现 Enum 并在 init 方法中加载游标!

希望这可以帮助。

于 2012-10-02T18:30:26.167 回答