菜鸟教程小白 发表于 2022-12-13 13:34:16

iOS - 父/ subview 的 Quartz 绘图问题


                                            <p><p><strong>场景</strong></p>

<p>我有两种观点。一种是“父” View ,其中包含一个“子” View ,用于绘图。我在后面的代码中将 child 称为 QuartzView。 QuartzView 知道如何根据自己的上下文绘制正方形。</p>

<p><strong>问题</strong></p>

<p>当我告诉它的 <code>self</code> 上的 QuartzView 绘制一个正方形时,它会按预期进行。当我使用父 View 告诉 QuartsView 在它的 <code>self</code> 上绘制一个正方形时,它会在屏幕左下角以预期大小的 1/5 左右绘制正方形。</p>

<p><strong>问题</strong></p>

<p>我认为这里存在一些父/子或上下文问题,但我不确定它们是什么。如何让两个正方形以完全相同的大小在完全相同的位置绘制?</p>

<h1>父<code>ViewController</code></h1>

<pre><code>- (void)drawASquare {

    // this code draws the &#34;goofy&#34; square that is smaller and off in the bottom left corner
    x = qv.frame.size.width / 2;
    y = qv.frame.size.height / 2;
    CGPoint center = CGPointMake(x, y);
    ];

}
</code></pre>

<h1>子 <code>QuartzView</code></h1>

<pre><code>- (void)drawRect:(CGRect)rect
{
    self.context = UIGraphicsGetCurrentContext();
    UIColor *color = ;

    // this code draws a square as expected
    float w = self.frame.size.width / 2;
    float h = self.frame.size.height / 2;
    color = ;
    CGPoint center = CGPointMake(w, h);
    ;
}

- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color
{
    CGContextSetFillColorWithColor(self.context, color.CGColor);
    CGContextSetRGBStrokeColor(self.context, 0.0, 1.0, 0.0, 1);

    CGRect rectangle = CGRectMake(center.x - w / 2, center.x - w / 2, w, h);

    CGContextFillRect(self.context, rectangle);
    CGContextStrokeRect(self.context, rectangle);
}
</code></pre>

<p><em>注意</em></p>

<ul>
<li>两个正方形的不透明度相同</li>
<li>我关闭了“自动调整 subview 大小”,但没有明显区别</li>
<li><code>view.contentScaleFactor = [ scale];</code> 没有帮助</li>
</ul>

<h1>编辑</h1>

<p>我注意到从左下角开始绘制父级时正方形的 x/y 值是 0,0,而通常 0,0 是左上角。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>UIGraphicsGetCurrentContext()</code> 的返回值仅在 <code>drawRect</code> 方法内有效。您不能也不得在任何其他方法中使用该上下文。所以 <code>self.context</code> 属性应该只是一个局部变量。</p>

<p>在 <code>drawRectWithCenter</code> 方法中,您应该将所有参数存储在属性中,然后使用 <code></code> 请求 View 更新。这样,框架将使用新信息调用 <code>drawRect</code>。 <code>drawRectWithCenter</code> 方法应该是这样的</p>

<pre><code>- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color
{
    self.showCenter = center;
    self.showWidth = w;
    self.showHeight = h;
    self.showFillColor = color;
    ;
}
</code></pre>

<p>当然,<code>drawRect</code> 函数需要获取该信息,并进行适当的绘图。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iOS - 父/ subview 的 Quartz 绘图问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37353312/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37353312/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS - 父/ subview 的 Quartz 绘图问题