【问题标题】:Wrong value for NSView _frame Objective-CNSView _frame Objective-C 的值错误
【发布时间】:2012-11-17 04:28:19
【问题描述】:

我想在名为 SettingsViewer 的子类 NSView 的右上角绘制一个 160x160 的圆圈。我必须承认我是这个绘图行业的新手;(虽然我之前做过一些绘图,这与我现在所做的完全不同,但更复杂的是我这次遇到了问题。

我将我的 SettingsViewer 链接到我的 SettingsViewer.h 中的 IBOutlet SettingsViewer *myView; 以通过使用按钮进行测试来绘制这个圆圈。

我要做的第一件事是找出我的视图区域的边界,如下所示:

NSRect circleBounds = myView->_frame;

这是我以前做过的,效果很好。但在这里我得到了正确的宽度值和一个奇怪的高度值:

高度应为 407。

我得到这个错误值的任何线索?

罗纳德·霍夫曼

【问题讨论】:

    标签: objective-c height frame nsview


    【解决方案1】:

    你可以覆盖-drawRect::

    -(void)drawRect:(NSRect)rect
    {
        CGRect bounds = self.bounds ;
        NSBezierPath * path = [ NSBezierPath bezierPathWithOvalInRect:(NSRect){ 
            { CGRectGetMaxX( bounds ) - 160.0f, CGRectGetMaxY( bounds ) - 160.0f }
            , { 160.0f, 160.0f } 
        } ] ;
        [ path stroke ] ;
    }
    

    【讨论】:

    • 如果您希望您的圈子为 160x160,请忽略您的视图框架。此外,在视图内,您的绘图画布/坐标由边界给出。 Frame 在其父视图中表示视图的范围。
    • >Frame 在其父视图中指示视图的范围:啊哈我做了更多的测试,当我添加这一行时发现:circleBounds = myView->_bounds;我得到了正确的值。
    • 为什么当我在 IBAction 中使用它时它不起作用?它可以在 drawRect 中工作。
    • 另外,不要使用 _bounds 和 _frame——这些可能是NSView 的内部属性。使用[ self frame ]或[ self bounds ]是正确的
    • 您的绘图上下文是在调用 -drawRect: 之前设置的。您不能在-drawRect: 之外绘制。如果您希望重绘视图,请使用[ self setNeedsDisplay:YES ] 请求它,而drawRect: 将在未来某个时间被调用。
    【解决方案2】:

    当我在 IBAction 中使用它时,为什么它不起作用?

    因为你知道你有一个有效的绘图上下文的唯一时间是在 drawRect 方法中。如果 IBAction 需要更新视图,它应该使用 [theView setNeedsDisplay:YES]。

    【讨论】:

    • 是的,我发现这就是我第一次画画时所做的。
    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多