2016-05-20 72 views
2

方案iOS的 - 與父母石英繪製發行/子視圖

我有兩個看法。一個是「父」視圖,其中包含執行繪圖的「子視圖」。我將代碼中的孩子稱爲QuartzView。 QuartzView知道如何繪製一個正方形到它自己的上下文。

問題

當我告訴QuartzView它是self繪製一個正方形它這樣做符合市場預期。當我使用父視圖來告訴QuartsView在它的self上繪製一個正方形時,它會在屏幕左下角以大約1/5的預期大小繪製正方形。

問題

我認爲這裏有一些父/子或環境問題,但我不知道它們是什麼。我怎樣才能讓兩個方格在同一個地方以完全相同的尺寸畫出來?

家長ViewController

- (void)drawASquare { 

    // this code draws the "goofy" 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); 
    [qv drawRectWithCenter:center andWidth:50 andHeight:50 andFillColor:[UIColor blueColor]]; 

} 

兒童QuartzView

- (void)drawRect:(CGRect)rect 
{ 
    self.context = UIGraphicsGetCurrentContext(); 
    UIColor *color = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; 

    // this code draws a square as expected 
    float w = self.frame.size.width/2; 
    float h = self.frame.size.height/2; 
    color = [UIColor blueColor]; 
    CGPoint center = CGPointMake(w, h); 
    [self drawRectWithCenter:center andWidth:20 andHeight:20 andFillColor:color]; 
} 

- (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); 
} 

  • 的混濁是兩個正方形相同
  • 我關掉「自動調整子視圖」,沒有明顯的區別
  • view.contentScaleFactor = [[UIScreen mainScreen] scale];並沒有幫助

編輯

我注意到,該廣場的x/y值繪製從開始時父左下角爲0,0,而通常0,0爲左上角。

回答

2

UIGraphicsGetCurrentContext()的返回值是唯一的方法drawRect內有效。你不能也不能用任何其他方法使用該上下文。所以self.context屬性應該只是一個局部變量。

drawRectWithCenter方法中,您應該將所有參數存儲在屬性中,然後請求使用[self setNeedsDisplay]更新視圖。那樣的話,框架將會調用drawRect這個新的信息。該drawRectWithCenter方法應該是這個樣子

- (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; 
    [self setNeedsDisplay]; 
} 

當然,在drawRect功能需要採取這些信息,並做相應的圖紙。

+2

這是一個沒有明確提到的好處 - 不要試圖存儲和重用圖形上下文。 – Caleb

+1

這個答案的第一句話通常不是真的,但爲了這個問題就足夠接近了。 UIGraphicsGetCurrentContext()有效的地方還有其他有效的地方。但是OP沒有使用這些情況。 – rmaddy

+0

@rmaddy不夠公平。這有點像說你不能拿一個負數的平方根。最終,學生準備理解更先進的概念,但最初最好保持簡單。 – user3386109

2

我假設這裏有一些家長/孩子或上下文問題,但我不確定他們是什麼。我怎樣才能讓兩個方格在同一個地方以完全相同的尺寸畫出來?

您通常不需要擔心圖形上下文中你-drawRect:方法,因爲可可觸摸將設置上下文你叫-drawRect:之前。但是視圖控制器中的-drawASquare方法調用-drawRectWithCenter:...以在正常繪製過程之外繪製,因此不會爲您的視圖設置上下文。你應該真的有看法在-drawRect:的繪圖。如果您的視圖控制器希望使視圖重繪,它應該叫-setNeedsDisplay,如:

[qv setNeedsDisplay]; 

這將視圖添加到圖紙列表,圖形系統將設置圖形上下文並調用視圖的-drawRect:爲你。

我注意到,當從左下角開始繪製父元素時,正方形的x/y值爲0,0,而通常0,0是左上角。

UIKit和Core Animation使用左上角的原點,但Core Graphics(又名Quartz)通常使用左下角的原點。該文件說:

The default coordinate system used by Core Graphics framework is LLO-based.

+0

這當然是新的信息,但它只是讓我到目前爲止。因爲兩次使用同一個視圖的方法,爲什麼一個正方形繪製到UIKit而另一個繪製到Quartz? – Jacksonkr

+1

@Jacksonkr因爲只有在調用'-drawRect:'時才設置上下文。我早點擊了提交按鈕,更新了我的答案。往上看。 – Caleb