首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSScrollView问题

NSScrollView问题
EN

Stack Overflow用户
提问于 2011-07-06 01:52:25
回答 2查看 2.3K关注 0票数 4

我正在尝试使用的NSScrollView有一些问题,可能需要一些帮助。我已经阅读了NSView、NSScrollView和其他一些指南和参考资料,以及这里的问题和cocoadev,但仍然无法解决这些问题。

(我的视图子类的代码可以在下面找到。)

我的总体目标是像KGChart这样的界面,这是一个针尖图表制造商,是个人电脑独家。(KGChart网站)

  1. 如何将我绘制的东西保存在滚动视图中?我的-drawStitch方法是在鼠标事件期间执行的,它在鼠标事件中将带有符号的rect (当前只有黑色和"+")绘制到滚动视图的文档视图中。当我滚动它远离视线和后退,它已经消失,我需要保留它不知何故。我的想法是尝试一个2D数组来跟踪缝线,但我认为大画布的性能会受到影响(我想做2000×2000,但我会满足于500x500)。
  2. 如果您查看我的程序运行的图片,您可以看到网格颜色的差异。绘制网格的代码在-drawRect中,颜色设置为grayColor。当程序开始时,可见的网格是较浅的颜色,但是当我滚动时,在画布上显示的部分会更暗。我认为这与-drawRect被调用有关,导致它重新绘制网格,但我不知道为什么它会使笔画变暗,因为它们的不透明度应该已经是1.0了。此外,如果我滚动原来的框架完全离开,并返回,网格也是黑暗的。
  3. 有没有一种方法可以让我在程序开始的时候画出不在drawRect中的网格,这样它就不会被重新绘制?我在-awakeFromNib和-initWithFrame上试过,甚至在-lockFocus上也试过,但是没有用。我意识到第一个可能不起作用,因为没有一个框架可以画。
  4. 最终,我需要找出诸如fill工具之类的东西,所以使用类似Core这样的工具更好,还是普通的API可以呢?我宁愿使用后者,因为我知道它比CG更多,但我也读了一点。

最后注意:我正在使用垃圾收集,我已经翻转了视图和它所在的窗口,如果这些事情真的很重要的话。

程序运行的图片:

代码语言:javascript
运行
复制
    - (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    [self setFrameSize:NSMakeSize(3000, 3000)];
    return self;
}

- (void)drawRect:(NSRect)rect {

    width = [self frame].size.width;
    height = [self frame].size.height;

    [[NSColor grayColor] setStroke];

    NSBezierPath* drawingPath = [NSBezierPath bezierPath];
    [NSBezierPath setDefaultLineWidth:2.0];
    [self addDashStyleToPath:drawingPath];

    int i;

    for( i = 0 ; i <= width ; i=i+30) {
        [drawingPath moveToPoint:NSMakePoint(i, 0)]; 
        [drawingPath lineToPoint:NSMakePoint(i, height)]; 
    } 

    for( i = 0 ; i <= height ; i=i+30) { 
        [drawingPath moveToPoint:NSMakePoint(0,i)]; 
        [drawingPath lineToPoint:NSMakePoint(width, i)]; 
    }

    [drawingPath stroke];

}
-(void)drawStitch{

    NSPoint thisPoint;
    NSPoint fillPoint;
    NSRect fillRect;


    float thisPointX = [self calculatedItemBounds].origin.x + 5.0;
    float thisPointY = [self calculatedItemBounds].origin.y - 8.0;

    float fillPointX = [self calculatedItemBounds].origin.x + 1.0;
    float fillPointY = [self calculatedItemBounds].origin.y + 1.0;

    thisPoint.x = thisPointX;
    thisPoint.y = thisPointY;

    fillPoint.x = fillPointX;
    fillPoint.y = fillPointY;

    fillRect.origin.x = fillPoint.x;
    fillRect.origin.y = fillPoint.y;

    fillRect.size.width = 28;
    fillRect.size.height = 28;

    NSMutableDictionary *theAttributes;

    theAttributes = [[NSMutableDictionary alloc] init];
    [theAttributes setObject: [NSColor whiteColor] forKey:NSForegroundColorAttributeName];
    [theAttributes setObject: [NSFont fontWithName:@"Helvetica" size: 32] forKey: NSFontAttributeName];

    NSString *theString = @"+";
    [self lockFocus];
    [[NSColor blackColor] setFill];
    [NSBezierPath setDefaultLineWidth:2.0];
    [self addDashStyleToPath:[NSBezierPath bezierPathWithRect:[self calculatedItemBounds]]];
    [NSBezierPath fillRect:fillRect];

    NSNumber* myInteger = [NSNumber numberWithInt:310];

    [myArray setObject:myInteger :location.x/30 :location.y/30];
    NSLog(@"%@", [myArray objectInSection:location.x/30 :location.y/30]);
    NSLog(@"%f, %f", location.x/30,location.y/30);

    [theString drawAtPoint:thisPoint withAttributes:theAttributes];
    [self displayIfNeededInRectIgnoringOpacity:[self calculatedItemBounds]];

    [self unlockFocus];
    [theAttributes release];
}

很明显,我对此很不在行,所以谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-13 03:08:42

我相信我把这个修好了。为了使其工作,我不得不重新安排我的代码在drawRect中进行绘图,而不是在我的drawStitch方法中使用lockFocus (我需要阅读MVC设计)。另外,滚动视图似乎只重画了最新的bezier路径,因此要进行多次“缝合”,我需要在路径后面添加rects。

票数 1
EN

Stack Overflow用户

发布于 2011-07-06 02:42:10

默认情况下,NSClipView的内容视图( NSScrollView的一个实例)通过在滚动时复制其现有呈现的图像来进行一些性能优化。大多数情况下,这很好,但是当您绘制一个复杂的自定义视图时,它通常是不需要的行为,因此您应该关闭它。

如果您使用nib来定义您的UI,只需选择IB中的滚动视图并取消选中“”复选框。

您可以使用‑setCopiesOnScroll:NSClipView方法以编程方式设置它。

代码语言:javascript
运行
复制
[[scrollView contentView] setCopiesOnScroll:NO];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6590746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档