NSScrollView滚动控制

       UI设计时,通常会使用到一些涉及到NSScrollView的控件或用户自定义的滚动视图;在某些情况下,我们需要使用代码来控制NSScrollView的滚动(而不是用户使用鼠标拖动或点击箭头来触发滚动操作);这时就需要明确NSScrollView的实现方式,并在此基础上通过视图移动来实现NSScrollView的滚动操作;

 

首先需要介绍NSScrollView的实现方式。NSScrollView自身是NSView的子类,它是一个组合控件;它的层次结构如下所示:

 

 

NSScrollView滚动控制_第1张图片

 

图中的NSScrollView中包含了一个content view , 这个content view NSClipView的一个实例对象,它是一个clip view。在clip view内部有一个document view, 这个document view是一个NSView类或者其派生类的实例对象; 这个document view 里面的内容才是NSScrollView中需要通过滚动浏览的内容;所谓滚动,实际可以把clip view看成一个大小固定的观景窗,我们需要通过这个观景窗去浏览document view。这样我们可以有以下结论,当document view的尺寸比clip view 的尺寸小的情况下,可以通过clip view 观察到document view 的全部内容;反之,当document view 的尺寸比clip view的尺寸大的情况下,就不能通过clip view直接看到document view的全部内容,在clip view的尺寸固定的情况下,我们可以通过移动clip view相对于document view的位置从而实现通过clip view观察document view的内容;对于用户,可以使用鼠标拖拽NSScrollView的滑块或点击上翻下翻按钮来实现滚动控制。如果需要通过逻辑控制NSScrollView的滚动操作,需要调用NSView- (void)scrollPoint:(NSPoint)aPoint 方法,使得cilp view的坐标原点移动到document view aPoint位置;实例代码如下:

 

  float ScrollLocation = 0.0;

    float MaxScroll = 0.0;

   

    [[m_textview enclosingScrollView] setLineScroll:0.0f];

    [[m_textview enclosingScrollView] setPageScroll:0.0f];

      

    ScrollLocation = [[[m_textview enclosingScrollView] contentView] bounds].origin.y;

    MaxScroll = [[[m_textview enclosingScrollView] documentView] bounds].size.height - [[m_textview enclosingScrollView] documentVisibleRect].size.height;

   

    ScrollLocation += 10;

      

       if(ScrollLocation < 0)

    {

        ScrollLocation = 0;

    }

   

       else if(ScrollLocation >MaxScroll)

    {

        ScrollLocation = MaxScroll;

    }

[m_textview scrollPoint:NSMakePoint(0, ScrollLocation)];

 

    上述代码实现使用代码获取当前的Clip View的位置,在当前位置基础上将Clip View的位置向Y轴正方向移动10个单位距离。

你可能感兴趣的:(UI,float)