2010-03-03 3 views

ответ

4

См. the relevant chapter of the Quartz 2D Programming Guide и the reference documentation for CGPattern.

Важная деталь, которая похоронена в Руководстве по программированию под страницами и страницами «LOOK PRETTY PATTERNS», заключается в том, что вам нужно написать функцию обратного вызова, которая рисует один экземпляр шаблона и передает указатель на этот обратный вызов на CGPatternCreate. Когда вы нарисуете шаблон, Quartz вызовет ваш обратный вызов, а затем выложите все, что вы нарисовали.

6

вот небольшой отрывок

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self patternMake2:rect context:context]; 
} 
//------------------------------------------------------------------- 
//  patternMake2 
//------------------------------------------------------------------- 
void pattern2Callback (void *info, CGContextRef context) {  
    UIImage *image = [UIImage imageNamed:@"NavBarBg.png"]; 
    CGImageRef imageRef = [image CGImage]; 
    CGContextDrawImage(context, CGRectMake(0, 0, 320, 44), imageRef); 
} 


- (void)patternMake2:(CGRect)rect context:(CGContextRef)context 
{ 
    static const CGPatternCallbacks callbacks = { 0, &pattern2Callback, NULL }; 
    //NSLog(@"rect: %f %f %f %f", rect.origin.x, rect.origin.x, rect.size.width, rect.size.height); 
    //CGContextSaveGState(context); 
    CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL); 
    CGContextSetFillColorSpace(context, patternSpace); 
    CGColorSpaceRelease(patternSpace); 
    CGSize patternSize = CGSizeMake(315, 44); 
    CGPatternRef pattern = CGPatternCreate(NULL, self.bounds, CGAffineTransformIdentity, patternSize.width, patternSize.height, kCGPatternTilingConstantSpacing, true, &callbacks); 
    CGFloat alpha = 1; 
    CGContextSetFillPattern(context, pattern, &alpha); 
    CGPatternRelease(pattern); 
    CGContextFillRect(context, rect);  
    //CGContextRestoreGState(context); 
} 
+0

Если мы всегда передать NULL для информации? – kelin