2012-07-12 6 views
21

내 IOS 응용 프로그램에서 9 패치 이미지를 사용하고 싶습니다. 가능한가?IOS에서 9 패치 이미지를 사용하는 방법은 무엇입니까?

+4

Google ban :)? 1) 그래서 http://stackoverflow.com/questions/5570818/android-nine-patch-equivalent-for-other-platforms 2) Tortuga http://maniacdev.com/2011/07/open-source-library-and -guide-for-nine-nine-image-support-ios-platforms/ –

답변

17

UIImage의 방법 resizableImageWithCapInsets:(UIEdgeInsets)capInsets을 살펴보십시오.

+13

그게 9 패치가 아닙니다. –

+0

당신이 맞습니다. resizableImageWithCapInsets : 좋습니다. 그러나 9 패치가 아닙니다. 이미지 크기 조정 방법과 관련된 몇 가지 규칙을 적용 할 수 있습니다. 그러나 그것은 9 패치를 복제하지 않을 것입니다. – bturner

+0

예 위의 대답은 정확하지만 9 패치는 그보다 더 좋은 옵션입니다 –

2

당신은이 간단한 구현을 시도 할 수 있습니다 : 이 https://github.com/shiami/SWNinePatchImageFactory

개념은 간단하고

이 기법은 9 패치 PNG 이미지를 iOS 호환 가능하고 크기를 조정할 수있는 UIImage 객체로 변환하는 것입니다. 자세한 내용은 UIImage의 resizableImageWithCapInsets : (UIEdgeInsets) 인세 트를 참조하십시오. 그래서 패치 마커의 한 세그먼트 만 가로 및 세로로 늘릴 수 있습니다.

+ (UIImage*)createResizableImageFromNinePatchImage:(UIImage*)ninePatchImage 
{ 
    NSArray* rgbaImage = [self getRGBAsFromImage:ninePatchImage atX:0 andY:0 count:ninePatchImage.size.width * ninePatchImage.size.height]; 
    NSArray* topBarRgba = [rgbaImage subarrayWithRange:NSMakeRange(1, ninePatchImage.size.width - 2)]; 
    NSMutableArray* leftBarRgba = [NSMutableArray arrayWithCapacity:0]; 
    int count = [rgbaImage count]; 
    for (int i = 0; i < count; i += ninePatchImage.size.width) { 
     [leftBarRgba addObject:rgbaImage[i]]; 
    } 

    int top = -1, left = -1, bottom = -1, right = -1; 
    count = [topBarRgba count]; 
    for (int i = 0; i <= count - 1; i++) { 
     NSArray* aColor = topBarRgba[i]; 
     if ([aColor[3] floatValue] == 1) { 
      left = i; 
      break; 
     } 
    } 
    NSAssert(left != -1, @"The 9-patch PNG format is not correct."); 
    for (int i = count - 1; i >= 0; i--) { 
     NSArray* aColor = topBarRgba[i]; 
     if ([aColor[3] floatValue] == 1) { 
      right = i; 
      break; 
     } 
    } 
    NSAssert(right != -1, @"The 9-patch PNG format is not correct."); 
    for (int i = left + 1; i <= right - 1; i++) { 
     NSArray* aColor = topBarRgba[i]; 
     if ([aColor[3] floatValue] < 1) { 
      NSAssert(NO, @"The 9-patch PNG format is not support."); 
     } 
    } 
    count = [leftBarRgba count]; 
    for (int i = 0; i <= count - 1; i++) { 
     NSArray* aColor = leftBarRgba[i]; 
     if ([aColor[3] floatValue] == 1) { 
      top = i; 
      break; 
     } 
    } 
    NSAssert(top != -1, @"The 9-patch PNG format is not correct."); 
    for (int i = count - 1; i >= 0; i--) { 
     NSArray* aColor = leftBarRgba[i]; 
     if ([aColor[3] floatValue] == 1) { 
      bottom = i; 
      break; 
     } 
    } 
    NSAssert(bottom != -1, @"The 9-patch PNG format is not correct."); 
    for (int i = top + 1; i <= bottom - 1; i++) { 
     NSArray* aColor = leftBarRgba[i]; 
     if ([aColor[3] floatValue] == 0) { 
      NSAssert(NO, @"The 9-patch PNG format is not support."); 
     } 
    } 

    UIImage* cropImage = [ninePatchImage crop:CGRectMake(1, 1, ninePatchImage.size.width - 2, ninePatchImage.size.height - 2)]; 

    return [cropImage resizableImageWithCapInsets:UIEdgeInsetsMake(top, left, bottom, right)]; 
} 

SWNinePatchImageView는 펜촉 또는 스토리 보드 사용법도 제공합니다. repo에서 예제 프로젝트를 확인할 수 있습니다.

관련 문제