拖动 NSSegmentedControl 时出现泥泞的文本
Muddy text when dragging NSSegmentedControl
我在可拖动视图中有一个 NSSegmentedControl(这是一个用于演示问题的简化得多的测试用例)。
第一次创建时一切正常,如下图所示:
浅绿色背景的视图是可拖动的。如果我稍微拖动它,下面的 NSSegmentedControl 中的文本就会变成 "muddy",如图所示:
此外,在拖动视图时,NSSegmentedControl 中的文本会闪烁。
所有视图和控件都是在一个nib中创建的,没有异常代码。 view的wantsLayer属性设置为YES,这样就可以显示边框和背景色了。这只是为了更容易看到问题,但即使 wantsLayer 设置为 NO 也会出现问题。
只有在拖动视图时才会出现此问题。拖动主应用程序 window 不会导致此效果。
这是在 MacOS High Sierra 10.13.6、XCode 10.1
上运行
这快把我逼疯了,非常感谢您的帮助!
编辑:这里是拖动代码:
//
// DraggableView.h
//
#import <Cocoa/Cocoa.h>
@interface DraggableView : NSView
@property(assign,nonatomic) NSPoint dragStart;
@property(assign,nonatomic) NSPoint startOrigin;
@end
//
// DraggableView.m
//
#import "DraggableView.h"
@implementation DraggableView
// mouseDown - start dragging
- (void) mouseDown:(NSEvent *)theEvent {
_dragStart = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
_startOrigin = [self frame].origin;
}
// mouseDragged - move the view
- (void) mouseDragged:(NSEvent *)theEvent {
CGPoint currentDrag = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
CGPoint newOrigin = self.startOrigin;
newOrigin.x += (currentDrag.x - _dragStart.x);
newOrigin.y += (currentDrag.y - _dragStart.y);
[self setFrameOrigin:newOrigin];
}
@end
所有其他代码都是基于文档的应用程序的标准 Cocoa 样板文件。
nib 文件将可拖动视图定义为 DraggableView 的实例 class。
我通过如下更改拖动代码解决了这个问题:
// mouseDragged - move the view
- (void) mouseDragged:(NSEvent *)theEvent {
CGPoint newOrigin = self.startOrigin;
newOrigin.x += theEvent.deltaX;
newOrigin.y -= theEvent.deltaY;
[self setFrameOrigin:newOrigin];
_startOrigin = newOrigin;
}
此问题的根本原因是可拖动视图原点具有非整数坐标。感谢马特为我指明了正确的方向。
我在可拖动视图中有一个 NSSegmentedControl(这是一个用于演示问题的简化得多的测试用例)。
第一次创建时一切正常,如下图所示:
浅绿色背景的视图是可拖动的。如果我稍微拖动它,下面的 NSSegmentedControl 中的文本就会变成 "muddy",如图所示:
此外,在拖动视图时,NSSegmentedControl 中的文本会闪烁。
所有视图和控件都是在一个nib中创建的,没有异常代码。 view的wantsLayer属性设置为YES,这样就可以显示边框和背景色了。这只是为了更容易看到问题,但即使 wantsLayer 设置为 NO 也会出现问题。
只有在拖动视图时才会出现此问题。拖动主应用程序 window 不会导致此效果。
这是在 MacOS High Sierra 10.13.6、XCode 10.1
上运行这快把我逼疯了,非常感谢您的帮助!
编辑:这里是拖动代码:
//
// DraggableView.h
//
#import <Cocoa/Cocoa.h>
@interface DraggableView : NSView
@property(assign,nonatomic) NSPoint dragStart;
@property(assign,nonatomic) NSPoint startOrigin;
@end
//
// DraggableView.m
//
#import "DraggableView.h"
@implementation DraggableView
// mouseDown - start dragging
- (void) mouseDown:(NSEvent *)theEvent {
_dragStart = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
_startOrigin = [self frame].origin;
}
// mouseDragged - move the view
- (void) mouseDragged:(NSEvent *)theEvent {
CGPoint currentDrag = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
CGPoint newOrigin = self.startOrigin;
newOrigin.x += (currentDrag.x - _dragStart.x);
newOrigin.y += (currentDrag.y - _dragStart.y);
[self setFrameOrigin:newOrigin];
}
@end
所有其他代码都是基于文档的应用程序的标准 Cocoa 样板文件。
nib 文件将可拖动视图定义为 DraggableView 的实例 class。
我通过如下更改拖动代码解决了这个问题:
// mouseDragged - move the view
- (void) mouseDragged:(NSEvent *)theEvent {
CGPoint newOrigin = self.startOrigin;
newOrigin.x += theEvent.deltaX;
newOrigin.y -= theEvent.deltaY;
[self setFrameOrigin:newOrigin];
_startOrigin = newOrigin;
}
此问题的根本原因是可拖动视图原点具有非整数坐标。感谢马特为我指明了正确的方向。