如何使用可可实现时间线自定义控件?

问题描述:

My Cocoa应用程序收集需要在时间轴中显示的事件(NSManagedObject的实例)。我最初的方法是使用现有的基于Javascript的小部件(我尝试使用Simile Timeline和Timeglider)并使用WebView控件显示时间线。这原则上是有效的,但不幸的是,这些小部件不能很好地处理BC日期,这是我的应用程序的一个重要要求。如何使用可可实现时间线自定义控件?

在我的应用程序事件具有日期范围从500.000BC高达近日期。活动日期仅用一年表示。他们的日,月和时间属性是无关紧要的。

丢弃javascript的方法后,我留在显示使用自定义可可控制时间轴的选项。由于我找不到合适的人,我必须自己开发。

这将是我的第一个自定义可可控制和思考这一段时间,我想出了以下设计粗糙后:

  • 我需要一个自定义控件呈现的实际时间一致。此控件可能基于NSView。该控件应根据时间线上的刻度线数量乘以每个标记之间的宽度(像素)计算其大小。例如,时间线由几百年组成,每个世纪100个像素宽。在10.000BC和5.000BC之间的事件时间线则是5000个像素宽(10000 - 5000 = 5000年,等于50个世纪)。

  • 我需要一个滚动型包装的时间表,以允许它支持滚动行为。只需要水平滚动。

  • 我需要一些东西来表示一个实际事件。我正在考虑为此使用现有的控件,可能是标准的圆形按钮和标签一起作为单个控件。

  • 我需要一个自定义控件呈现在时间线上的刻度。

把这作为我在Cocoa的时间线组件的基本设计,这样做还是我完全忽略了这一点?

+0

罗杰,你有过这样的事吗?我遵循类似的时间表(只是为了覆盖24小时)。 – Darren

+0

@达伦是的,我做到了。工作很好。我刚刚完成了最初设计的重大重构。 – Roger

+0

@Roger你有没有iPhone的示例代码。我有类似的需求? – arshad

基本的方法听起来很好。

苹果有一个很好的例子,可以创建一个名为“TreeView”的自定义NSView。这是一个很好的理解样本。

https://developer.apple.com/library/mac/#samplecode/TreeView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010131

“树视图”呈现从头开始创建一个完全新的自定义 视图(通过直接子类的NSView)的一个例子。它的实施 说明了许多参与创建自定义视图 ,包括内容布局的问题,绘图,处理用户 互动,并提供辅助支持的考虑。

你可能要考虑的另一件事是放大和缩小。如果你有很长的时间表,我想你可能想缩小,然后放大一组活动。如果您在公元前10k有一个事件,然后很久以后发生一连串事件,用户可以滚动浏览大量空白空间来查找事件。另一种方法是在上面有一个适合于/静态大小的小型时间轴,这有点像索引,其中线条显示活动点 - 然后点击它将自动滚动到该点。这可能是一个很好的取决于你的数据。

的几点思考:

对于一些这种风俗画,你要重写的drawRect绘制您的线条和布局的子控件。

如果您绘制背景或意见的任何部分,确保启用层支持的观点:

[self setWantsLayer:YES]; 

如果可以的话,正如你指出,尝试添加和布局充分利用现有的控制。在我的自定义控件中,我维护独立于代表所有对象状态的视图/控件的数据结构。在drawRect中,我检测到视图正在改变,我调用了我的layoutSubviews函数。我的layoutSubViews函数将从我的数据结构中进行数学运算,并创建或移动现有控件的框架。这适用于调整大小和缩放。如果放大,你的标签广告标记将需要很好地反应被缩小非常小的 - 也许文字滴出在某个时刻等..

if ([self dataSource] && 
    !NSEqualRects(_prevRect, [self bounds])) 
{ 
    // layoutViews is my custom function that worked over the data structures 
    // and moved the frame 
    [self layoutViews]; 
} 

_prevRect = [self bounds]; 

希望有所帮助。

+0

谢谢。关于缩放的好点。我尝试过的一个Javascript小部件具有迷你时间轴功能。暂时我会把它放在一边,以增加#2 :-) – Roger