【问题标题】:Core Plot: Cursor does not adjust over CPTGraphHostingView核心情节:光标不会在 CPTGraphHostingView 上调整
【发布时间】:2019-07-31 23:37:38
【问题描述】:

我在两个 macOS 应用程序中使用 Core Plot(第一个是旧的,第二个是新的)。他们每个人都有一个CPTGraphHostingView,其中显示了一些图。我可以单击、按住和拖动来更改可见区域。

在第一个应用程序中,当我将鼠标悬停在情节上时,光标变为张开的手。当我拖动时,它也会变成闭合的手。这就是我想要的,也是 Core Plot 的所有示例应用程序中的行为。

在第二个应用程序中,光标始终保持不变(箭头)。

编辑:这是 Xcode 中视图层次结构的屏幕截图(绘图视图后面的视图被隐藏)。 CPTGraphHostingView 前面没有视图,只有少数控件在视图层次结构中较高,但它们位于绘图周围。

我找不到我的两个应用程序(或第二个应用程序和示例应用程序)之间可能导致此问题的任何差异。这两个应用程序都使用 Xcode 10.1 和 Core Plot release-2.3 分支编译。

我应该寻找什么?

【问题讨论】:

    标签: objective-c macos core-plot appkit


    【解决方案1】:

    检查是否有任何其他不可见的视图遮挡 Core Plot 托管视图。第二个应用程序中的其他所有内容(布局、外观等)是否按您预期的方式工作?

    【讨论】:

    • 我查看了视图层次结构,但情节视图前面没有视图。其他一切都按预期工作。我在问题中添加了视图层次结构的图片。
    • Core Plot 在宿主视图上设置光标矩形。检查视图层次结构中可能捕获光标或覆盖核心绘图设置的任何其他内容。
    • 我发现CPTGraphHostingView 中的initWithFrame 在我的第二个应用程序中没有被调用,所以手形光标始终是nil。它在我的第一个应用程序中被调用。到目前为止,我不知道为什么。然后我将CPTGraphHostingView 子类化并从NSCursor 加载awakeFromNib 中的游标。这行得通。你认为initWithFrame 没有被调用会有一些副作用吗?你在那里做了一些额外的初始化。此问题在 Apple 的“创建自定义视图”文档中进行了讨论。
    • 应该可以。您可能还需要将 allowPinchScaling 设置为 YES 以在触控板上启用捏合手势。
    • 这是一个很好的建议,谢谢。如果您相应地更新您的答案,我可以接受。
    【解决方案2】:

    由于CPTGraphHostingView 中的initWithFrame 没有在我的第二个应用程序中被调用,所以手形光标始终为nil 并且无法调整。这是来自 Apple 的“Creating a Custom View”文档:

    在 Interface Builder 中创建的视图实例不会调用 initWithFrame:当他们的 nib 文件被加载时,这通常会导致 困惑。请记住,Interface Builder 归档对象时 保存一个 nib 文件,所以视图实例已经被创建 和 initWithFrame: 已经被调用了。

    awakeFromNib 方法提供了一个机会来提供 由于 nib 文件而创建视图时的初始化 正在加载。加载包含视图对象的 nib 文件时, 当所有视图实例都收到一条 awakeFromNib 消息时 对象已取消归档。这为对象提供了机会 初始化任何未与对象一起归档的属性 界面生成器。

    所以我继承了 CPTGraphHostingView 并使用 Eric Skroch 的建议将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多