2011-10-26 2 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는 패턴이 그려지는 시작점입니다.

방금 ​​패턴을 사용하여 실수를했습니다. 현재 컨텍스트의 위상을 설정하지 않으면 매번 컨텍스트 (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의 경계를 변경하면 가 업데이트되지 않습니다 - 코너 때로는 얻을 수 있도록 모든 터져 (그들은 자동으로 조정하고 있기 때문에).

빠른 수정 초기화 방법 모두에 다음을 추가하는 것입니다

self.contentMode = UIViewContentModeRedraw;

당신에게 setNeedsDisplay를 호출의 문제를 저장 다시 그리기 위해 contentMode 설정. UIView의 프레임을 즉시 변경하거나 애니메이션을 적용 할 수 있으며 UIView가 자동으로 다시 그려집니다.

나중에 더 자세히 살펴 보겠습니다. 실제로 구현하려고합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 지금 contentMode를 시도했지만 여전히 작동하지 않습니다. – wcrane

+0

drawRect를 대체 했습니까? – Mazyod

+0

그래, 위의 코드를 넣었습니다. 나는 drawRect를 오버라이드하고 이미지는 내가 가진 결과이다. – wcrane

관련 문제