2011-10-26 6 views
4

私はいくつかの小さな写真で私のiPhoneアプリのための柔軟なフレームを作成しようとします。 CustomViewはUIViewを継承し、setFrame:メソッドをオーバーライドします。 setFrame:では、私は[self setNeedsDisplay];に電話をかけようとしています。写真を拡大縮小するたびに、このフレームが実際に表示され、変更されましたが、何かがうまく機能しません。コードと以下の効果:iPhoneの写真のフレキシブルフレームを作成するには?

This is the image that I used to draw the frame, in code for self.patternImage


Effect of my code


Effect of my code


//はoriginImageの鏡像を得るために回転させ、そしてisHorizationは、回転方向を意味 - (UIImage *)fetchMirrorImage:(UIImage *)originImage direction:(BOOL)isHorization { CGSize imageSize = originImage.size; UIGraphicsBeginImageContext(imageSize); CGContextRef context = UIGraphicsGetCurrentContext(); CGAffineTransform transform = CGAffineTransformIdentity;

if (isHorization) { 
     transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
    }else { 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
    } 

    CGContextScaleCTM(context, 1, -1); 
    CGContextTranslateCTM(context, 0, -imageSize.height); 
    CGContextConcatCTM(context, transform); 

    CGContextDrawImage(context, CGRectMake(0, 0, imageSize.width, imageSize.height), originImage.CGImage); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

- (UIImage*)fetchPattern:(PatternType)pattern{ 
    if (!self.patternImage) { 
     return nil; 
    } 

    UIImage *tmpPattern = nil; 
    CGRect fetchRect = CGRectZero; 
    CGSize imageSize = self.patternImage.size; 
    switch (pattern) { 
     case kTopPattern: 
      fetchRect = CGRectMake(self.insetSize.width, 0, imageSize.width-self.insetSize.width, self.insetSize.height); 
      tmpPattern = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(self.patternImage.CGImage, fetchRect)]; 
      break; 
     case kTopRightPattern: 
      fetchRect = CGRectMake(0, 0, self.insetSize.width, self.insetSize.height); 
      tmpPattern = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(self.patternImage.CGImage, fetchRect)]; 

      break; 
     case kRightPattern: 

      break; 
     case kRightBottomPattern: 

      break; 
     case kBottomPattern: 

      break; 
     case kLeftBottomPattern: 

      break; 
     case kLeftPattern: 
      fetchRect = CGRectMake(0, self.insetSize.height, self.insetSize.width, imageSize.height-self.insetSize.height); 
      tmpPattern = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(self.patternImage.CGImage, fetchRect)]; 
      break; 
     case kLeftTopPattern: 
      fetchRect = CGRectMake(0, 0, self.insetSize.width, self.insetSize.height); 
      tmpPattern = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(self.patternImage.CGImage, fetchRect)]; 
      break; 
     default: 
      break; 
    } 

    return tmpPattern; 
} 

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 
    if (self.patternImage == nil) { 
     return; 
    } 

    // Drawing code. 
    UIImage *conLeftImage = [self fetchPattern:kLeftTopPattern]; 
    [conLeftImage drawAtPoint:CGPointMake(0, 0)]; 

    UIImage *topImage = [self fetchPattern:kTopPattern]; 
    [topImage drawAsPatternInRect:CGRectMake(self.insetSize.width, 0, self.frame.size.width-self.insetSize.width*2, self.insetSize.height)]; 

    UIImage *leftImage = [self fetchPattern:kLeftPattern]; 
    [leftImage drawAsPatternInRect:CGRectMake(0, self.insetSize.height, self.insetSize.width, self.frame.size.height-self.insetSize.height*2)]; 

    UIImage *conRightImage = [self fetchMirrorImage:conLeftImage direction:YES]; 
    [conRightImage drawAtPoint:CGPointMake(self.frame.size.width-self.insetSize.width, 0)]; 

    UIImage *rightImage = [self fetchMirrorImage:leftImage direction:YES]; 
    CGRect rectRight = CGRectMake(self.frame.size.width-self.insetSize.width, self.insetSize.height, self.insetSize.width, self.frame.size.height-self.insetSize.height*2); 
    [rightImage drawAsPatternInRect:rectRight]; 

    UIImage *botRightImage = [self fetchMirrorImage:conRightImage direction:NO]; 
    [botRightImage drawAtPoint:CGPointMake(self.frame.size.width-self.insetSize.width, self.frame.size.height-self.insetSize.height)]; 

    UIImage *bottomImage = [self fetchMirrorImage:topImage direction:NO]; 
    CGRect bottomRect = CGRectMake(self.insetSize.width, self.frame.size.height-self.insetSize.height, self.frame.size.width-self.insetSize.width*2, self.insetSize.height); 
    [bottomImage drawAsPatternInRect:bottomRect]; 

    UIImage *botLeftImage = [self fetchMirrorImage:conLeftImage direction:NO]; 
    [botLeftImage drawAtPoint:CGPointMake(0, self.frame.size.height-self.insetSize.height)]; 

    [super drawRect:rect]; 
} 

- (void)setFrame:(CGRect)frame{ 
    [super setFrame:frame]; 

    [self setNeedsDisplay]; 
} 

答えて

4

ええ、私はそれを作る! final effect 私がする必要があるのは、現在のコンテキストのフェーズを設定することだけです。

CGContextSetPatternPhase(context, CGSizeMake(x, y)); 

X、Yは、Iパターンが描画されるようにする開始点です。

私はちょうどパターンを使用する間違いをしました。現在のコンテキストのフェーズを設定しないと、毎回コンテキスト(0,0)の左上からパターンが塗りつぶされます。

 CGColorRef color = NULL; 
    UIImage *leftImage = [UIImage imageNamed:@"like_left.png"]; 
    color = [UIColor colorWithPatternImage:leftImage].CGColor; 
    CGContextSetFillColorWithColor(context, color); 
    CGContextFillRect(context, CGRectMake(0, 0, FRAME_WIDTH, rect.size.height)); 

    UIImage *topImage = [UIImage imageNamed:@"like_top.png"]; 
    color = [UIColor colorWithPatternImage:topImage].CGColor; 
    CGContextSetFillColorWithColor(context, color); 
    CGContextFillRect(context, CGRectMake(0, 0, rect.size.width,FRAME_WIDTH)); 

    UIImage *bottomImage = [UIImage imageNamed:@"like_bom.png"]; 
    CGContextSetPatternPhase(context, CGSizeMake(0, rect.size.height - FRAME_WIDTH)); 
    color = [UIColor colorWithPatternImage:bottomImage].CGColor; 
    CGContextSetFillColorWithColor(context, color); 
    CGContextFillRect(context, CGRectMake(0, rect.size.height - FRAME_WIDTH, rect.size.width, FRAME_WIDTH)); 

    UIImage *rightImage = [UIImage imageNamed:@"like_right.png"]; 
    CGContextSetPatternPhase(context, CGSizeMake(rect.size.width - FRAME_WIDTH, 0)); 
    color = [UIColor colorWithPatternImage:rightImage].CGColor; 
    CGContextSetFillColorWithColor(context, color); 
    CGContextFillRect(context, CGRectMake(rect.size.width - FRAME_WIDTH, 0, FRAME_WIDTH, rect.size.height)); 
0

まず、私はこれを言うだろう:
私は今、本当の答えを持っていません。しかし、私はヒントを持っている。私はそれが役に立つと思う。

tutorial posted by Larmarcheによると、drawRect:をオーバーライドすることで、簡単にUIViewの枠線をカスタマイズできます。以下のコメント(下のチュートリアルのウェブサイト)にスクロールすると、次のコメントを見ることができます:

他のグリッチを発見しました。 RoundRectの境界線を変更すると、 は更新されません。のコーナーは時々すべてねじ込み (自動的に縮尺されるため)になります。

クイックフィックスは、initメソッドの両方に以下を追加することです:あなたsetNeedsDisplayを呼び出す手間を節約し再描画するcontentModeを設定

self.contentMode = UIViewContentModeRedraw;

。 UIViewのフレームを簡単に変更したり、瞬時にアニメーション化したり、UIViewが自動的に再描画したりすることができます。

私は実際にそれを実装しようとします。

+0

ご回答ありがとうございます。今はcontentModeを試しましたが、まだ動作しません。 – wcrane

+0

drawRectをオーバーライドしましたか? – Mazyod

+0

ええ、私は上記のコードを入れました。私はdrawRectをオーバーライドします。イメージは私が得た結果です。 – wcrane

関連する問題