2013-08-30 80 views
0

我已經在viewController上放置了一個視圖,我想在該視圖中繪製一個矩形,但是具有自定義高度。我根據我的viewController中的參數確定高度。例如, 。如果我的參數是50,我想矩形具有50%的UIView的高度。iOS drawRect自定義高度

2個問題:

  • 我怎麼能傳遞高度自定義的drawRect?

  • 如何讓矩形放置在UIView的底部?

我已經把使用界面生成器的視圖,我已經在的UIView的一個子類實施的drawRect和以此爲自定義類爲我UIView。

所以在自定義類,我有:

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIColor * lightGrayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1.0]; 

    CGRect paperRect = self.bounds; 

    drawLinearGradient(context, paperRect, lightGrayColor.CGColor, [UIColor clearColor].CGColor); 


} 

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor) 
{ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGFloat locations[] = { 0.0, 1.0 }; 

    NSArray *colors = @[(__bridge id) startColor, (__bridge id) endColor]; 

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations); 

    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

    CGContextSaveGState(context); 
    CGContextAddRect(context, rect); 
    CGContextClip(context); 
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
    CGContextRestoreGState(context); 

    CGGradientRelease(gradient); 
    CGColorSpaceRelease(colorSpace); 
} 

這繪製一個漂亮的漸變矩形在我看來,但它填補了完整的UIView。 這是因爲self.bounds。

我已經添加了一個屬性*高度到我的自定義類,但我不知道如何填寫從我的viewController。所以我希望它從UIView的底部開始,並使其達到我已經確定的高度(真實高度的百分之一)。

任何人都知道我可以做到這一點?

+0

爲什麼不添加子視圖(當前視圖的50%),然後填寫? –

回答

1

您是否在界面構建器中的身份檢查器中設置了自定義視圖類?

你可以從你的viewController設置了height屬性:

((MyViewClass *) self.myView).height = myCalculatedValue; 

然後實現的drawRect:

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIColor * lightGrayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1.0]; 

    CGRect paperRect = self.bounds; 
    paperRect.origin.y = paperRect.size.height - self.height; 
    paperRect.size.height = self.height; 
    //assuming your height property is of CGFloat type 

    drawLinearGradient(context, paperRect, lightGrayColor.CGColor, [UIColor clearColor].CGColor); 
} 

這將吸引來自底部以上(高)點的梯度底部

+0

Briljant!我已經在檢查器中設置了自定義視圖類,但我不知道(MyViewClass *)添加...非常感謝! – RobertvdBerg

+0

不客氣!如果IBOutlet的類型設置爲MyViewClass,則不需要該類型轉換。 – hacker2007

+0

啊....有我的錯誤!我將它設置爲UIView,而不是CustomView ... * doh *請爲這一個Dubble點數! – RobertvdBerg

1

我認爲你可以計算出屏幕高度的50%,然後從全屏幕高度

youParameter = 50; // Lets assume this is your parametere 

int heightOfView = ([UIScreen mainScreen].bounds.size.height * yourParameter)/100; 

// For placing the view to the bottom; 

CGRect newFrame; 
frame.origin.y = [UIScreen mainScreen].bounds.size.height - heightOfView; 
frame.origin.x = 0; 
frame.size.width = [UIScreen mainScreen].bounds.size.width; // assuming it will take full width 
frame.size.height = heightOfView; 

youViewToChange.frame = newFrame; // normally do this or 

。減去新視圖高度傳遞給drawRect中的價值,你可以這樣做:

[self drawRect:newFrame]; 
+0

嗯..當我把它放在我的UIViewController中,這使得視圖也變小,但我希望視圖保持完整的高度,但在這個視圖內(或頂部)繪製一個矩形。當我把它放在drawRect方法中時,矩形具有新的高度,但是然後我沒有在那裏有參數... – RobertvdBerg