核心情节:光标不会在 CPTGraphHostingView 上调整
Core Plot: Cursor does not adjust over CPTGraphHostingView
我在两个 macOS 应用程序中使用了 Core Plot(第一个是旧的,第二个是新的)。他们每个人都有一个 CPTGraphHostingView
,其中显示了一些图。我可以点击、按住并拖动来改变可见区域。
在第一个应用程序中,当我将鼠标悬停在绘图上时,光标变为张开的手。当我拖动时它也会变成一只闭合的手。这就是我想要的,这就是 Core Plot 所有示例应用程序中的行为。
在第二个应用程序中,光标始终保持不变(箭头)。
编辑:这是Xcode中视图层次结构的屏幕截图(隐藏了绘图视图后面的视图)。 CPTGraphHostingView
前面没有视图,只有几个控件在视图层次结构中较高,但它们位于绘图周围。
我无法在我的两个应用程序(或第二个应用程序和示例应用程序)之间找到可能导致此问题的任何差异。这两个应用程序都使用 Xcode 10.1 和 Core Plot release-2.3 分支编译。
我应该寻找什么?
检查是否有任何其他不可见视图遮挡了 Core Plot 托管视图。第二个应用程序中的其他所有内容(布局、外观等)是否按您预期的方式工作?
由于 CPTGraphHostingView
的 initWithFrame
在我的第二个应用程序中没有被调用,手形光标总是 nil
并且无法调整。这是来自 Apple 的“Creating a Custom View”文档:
View instances that are created in Interface Builder don't call
initWithFrame: when their nib files are loaded, which often causes
confusion. Remember that Interface Builder archives an object when it
saves a nib file, so the view instance will already have been created
and initWithFrame: will already have been called.
The awakeFromNib method provides an opportunity to provide
initialization of a view when it is created as a result of a nib file
being loaded. When a nib file that contains a view object is loaded,
each view instance receives an awakeFromNib message when all the
objects have been unarchived. This provides the object an opportunity
to initialize any attributes that are not archived with the object in
Interface Builder.
所以我使用 Eric Skroch 的建议将 CPTGraphHostingView
子类化并从 NSCursor
加载游标到 awakeFromNib
:
MyGraphHostingView.h:
#import <CorePlot/CorePlot.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyGraphHostingView : CPTGraphHostingView
@end
NS_ASSUME_NONNULL_END
MyGraphHostingView.m:
#import "MyGraphHostingView.h"
@implementation MyGraphHostingView
-(void)awakeFromNib
{
[super awakeFromNib];
if (!self.closedHandCursor) {
self.closedHandCursor = [NSCursor closedHandCursor];
}
if (!self.openHandCursor) {
self.openHandCursor = [NSCursor openHandCursor];
}
self.allowPinchScaling = YES;
}
@end
我在两个 macOS 应用程序中使用了 Core Plot(第一个是旧的,第二个是新的)。他们每个人都有一个 CPTGraphHostingView
,其中显示了一些图。我可以点击、按住并拖动来改变可见区域。
在第一个应用程序中,当我将鼠标悬停在绘图上时,光标变为张开的手。当我拖动时它也会变成一只闭合的手。这就是我想要的,这就是 Core Plot 所有示例应用程序中的行为。
在第二个应用程序中,光标始终保持不变(箭头)。
编辑:这是Xcode中视图层次结构的屏幕截图(隐藏了绘图视图后面的视图)。 CPTGraphHostingView
前面没有视图,只有几个控件在视图层次结构中较高,但它们位于绘图周围。
我无法在我的两个应用程序(或第二个应用程序和示例应用程序)之间找到可能导致此问题的任何差异。这两个应用程序都使用 Xcode 10.1 和 Core Plot release-2.3 分支编译。
我应该寻找什么?
检查是否有任何其他不可见视图遮挡了 Core Plot 托管视图。第二个应用程序中的其他所有内容(布局、外观等)是否按您预期的方式工作?
由于 CPTGraphHostingView
的 initWithFrame
在我的第二个应用程序中没有被调用,手形光标总是 nil
并且无法调整。这是来自 Apple 的“Creating a Custom View”文档:
View instances that are created in Interface Builder don't call initWithFrame: when their nib files are loaded, which often causes confusion. Remember that Interface Builder archives an object when it saves a nib file, so the view instance will already have been created and initWithFrame: will already have been called.
The awakeFromNib method provides an opportunity to provide initialization of a view when it is created as a result of a nib file being loaded. When a nib file that contains a view object is loaded, each view instance receives an awakeFromNib message when all the objects have been unarchived. This provides the object an opportunity to initialize any attributes that are not archived with the object in Interface Builder.
所以我使用 Eric Skroch 的建议将 CPTGraphHostingView
子类化并从 NSCursor
加载游标到 awakeFromNib
:
MyGraphHostingView.h:
#import <CorePlot/CorePlot.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyGraphHostingView : CPTGraphHostingView
@end
NS_ASSUME_NONNULL_END
MyGraphHostingView.m:
#import "MyGraphHostingView.h"
@implementation MyGraphHostingView
-(void)awakeFromNib
{
[super awakeFromNib];
if (!self.closedHandCursor) {
self.closedHandCursor = [NSCursor closedHandCursor];
}
if (!self.openHandCursor) {
self.openHandCursor = [NSCursor openHandCursor];
}
self.allowPinchScaling = YES;
}
@end