2013-08-18 3 views
0

나는이 주제가 Q & A를 많이 가지고 있다는 것을 안다, 나는 그것들을 모두 읽고 여전히 그것을 얻을 수 없었다. ... 나는 둥근 모서리를 유지하면서 이미지를 늘리려고하고있다.크기 조정 가능 UIImage

enter image description here

이 내가 사용하는 코드입니다 :

UIImage *bg = [UIImage imageNamed:@"btnBg"]; 
UIEdgeInsets insets = UIEdgeInsetsMake((bg.size.height - 1)/2, (bg.size.width - 1)/2, (bg.size.height - 1)/2, (bg.size.width - 1)/2); 
bg = [bg resizableImageWithCapInsets:insets]; 

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 50, 44)]; 
imgView.image = bg; 

UIImageView *imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, 250, 44)]; 
imgView2.image = bg; 

[self.view addSubview:imgView]; 
[self.view addSubview:imgView2]; 

는이 문제입니다 :

내 이미지 (104x77px)입니다

당신이 할 수 각 이미지의 가장자리가 다른 것을보십시오. 내가 뭘 잘못하고 있니?!

enter image description here

+2

이미지 뷰의 문제점들이 원본 이미지보다 (높이)보다 작은 것으로된다 (및 너무). 크기 조정이 가능한 이미지는 원래 크기보다 커야합니다. – rmaddy

답변

0

는, 두 개의 서로 다른 크기의 이미지가 상당히 동일하게 표시 할 수 없습니다

다음은 크기 조정 모드를 설정하는 데 사용하는 코드입니다. 그러나 이미지를 세 부분으로 나눌 수 있습니다 : 왼쪽 모서리, 중간 섹션 (단지 평행선) 및 오른쪽 모서리.

다양한 크기의 이미지보기를 만들려면 왼쪽 및 오른쪽 부분을 일정하게 유지하고 높이를 일정하게 유지하는 한 왜곡되지 않는 중간 부분의 크기를 조정하십시오.

높이가 원래 이미지 높이이기 때문에 나는 fitInRect의 높이를 77로 지정했습니다. 예를 들어 44로 변경할 수 있지만 모든 이미지보기의 숫자는 일정하게 유지하십시오. 마지막으로, widthToPreserve HAS는 최소 34입니다 (즉, 전체 Rect 폭은 68 이상이어야 함). 원래 이미지에서 둥근 가장자리의 너비이기 때문입니다.

물론 목표 이미지보기 높이가 44 인 경우 더 작은 이미지를 사용하여이 모든 것을 간단하게 수행 할 수 있습니다.

이 코드는 작동 :

-(void)viewDidAppear:(BOOL)animated 
{ 
    UIImage *img = [UIImage imageNamed:@"img"]; 

    UIImageView *view1 = [self getImageViewFromImage:img widthToPreserve:34 fitInRect:CGRectMake(20, 20, 100, 77)]; 

    UIImageView *view2 = [self getImageViewFromImage:img widthToPreserve:34 fitInRect:CGRectMake(20, 120, 250, 77)]; 

    [self.view addSubview:view1]; 
    [self.view addSubview:view2]; 

} 

-(UIImageView*)getImageViewFromImage:(UIImage*)image widthToPreserve:(float)width fitInRect:(CGRect)rect 
{ 
    CGImageRef left, middle, right; 
    CGRect leftRect, middleRect, rightRect; 
    UIImage *leftImage, *middleImage, *rightImage; 
    UIImageView *leftView, *middleView, *rightView; 

    // calculate CGRect values for the original image 
    leftRect = CGRectMake(0, 0, width, image.size.height); 
    middleRect = CGRectMake(width, 0, image.size.width - 2*width, image.size.height); 
    rightRect = CGRectMake(image.size.width - width, 0, width, image.size.height); 

    left = CGImageCreateWithImageInRect([image CGImage], leftRect); 
    middle = CGImageCreateWithImageInRect([image CGImage], middleRect); 
    right = CGImageCreateWithImageInRect([image CGImage], rightRect); 


    leftImage = [UIImage imageWithCGImage:left]; 
    middleImage = [UIImage imageWithCGImage:middle]; 
    rightImage = [UIImage imageWithCGImage:right]; 

    leftView = [[UIImageView alloc] initWithImage:leftImage]; 
    middleView = [[UIImageView alloc] initWithImage:middleImage]; 
    rightView = [[UIImageView alloc] initWithImage:rightImage]; 

    //make your image subviews, with scaling on the middle view 
    [leftView setFrame:CGRectMake(0, 0, width, rect.size.height)]; 
    [middleView setFrame:CGRectMake(width, 0, rect.size.width - 2*width, rect.size.height)]; 
    [rightView setFrame:CGRectMake(rect.size.width - width, 0, width, rect.size.height)]; 

//add your 3 subviews into a single image view 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect]; 
    [imgView addSubview:leftView]; 
    [imgView addSubview:middleView]; 
    [imgView addSubview:rightView]; 


    CGImageRelease(left); 
    CGImageRelease(middle); 
    CGImageRelease(right); 

    return imgView; 
} 

스크린 샷 : 1이 좁은

enter image description here

1

나는 당신을 위해 무엇을 찾고있는 것은이 밖으로

[[UIImage imageNamed:@"someimage.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5]; 

으로 매디 지점이 우리가 무엇을 사용 아이폰 OS 4.3을 지원하는 데 우리의 불쌍한 영혼,에서 iOS 5에서 더 이상 사용되지 않습니다 신축성 이미지라고 생각합니다.

+0

iOS 5.0에서 'stretchableImageWithLeftCapWidth'이 (가) 더 이상 사용되지 않습니다. 'resizableImageWithCapInsets'는 지금 사용하는 적절한 방법입니다. – rmaddy

+0

@rmaddy는 정확합니다. 작동하지 않습니다. – Rizon

+0

내 대답이 업데이트되었습니다. 인 세트로 놀아볼 것을 제안합니다. 한 픽셀이 잘못된 위치에서 이미지를 늘리거나 크기를 조정할 수있는 재미있는 경우가 있습니다. – sbarow

0

이미지의 거주 모드를 지정할 수 있습니다. 선택 사항은 UIImageResizingModeStretchUIImageResizingModeTile입니다.

신축성있는 이미지가있는 아이디어는 작은 이미지 파일을 가질 수 있다는 것입니다. 앱 번들의 공간을 절약하려면 더 작은 이미지 사용을 고려해야합니다. 또한 왼쪽 및 오른쪽 모서리 삽입물이 중간에있을 필요는 없습니다. 그들은 당신의 이미지에서 약 40 점인 커브를 넘어서는 것입니다.

크기 조정이 관련 될 때마다
bg = [bg resizableImageWithCapInsets:insets resizingMode: UIImageResizingModeStretch]; 
+0

'resizableImageWithCapInsets : resizingMode :'는 iOS5에서 작동하지 않습니다. – Rizon

관련 문제