0

このトピックには多くの Q&A があることは知っていますが、それらをすべて読みましたが、まだ理解できませんでした... 画像の丸みを帯びたエッジを維持しながら、画像を引き延ばそうとしています。

これは私の画像です (104x77px):

ここに画像の説明を入力

これは私が使用しているコードです:

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];

これが問題です:

ご覧のとおり、各画像には異なるエッジがあります。私は何を間違っていますか?!

ここに画像の説明を入力

4

4 に答える 4

0

スケーリングが関係する場合はいつでも、2 つの異なる次元の画像がまったく同じに見えることはありません。ただし、画像を 3 つの部分 (左隅、中央セクション (平行線のみ)、および右隅) に分けることができます。

さまざまなサイズのイメージ ビューを作成するには、左右のパーツを一定に保ち、中央のセクションをスケーリングします。高さを一定に保つ限り、歪んだようには見えません。

fitInRect元の画像の高さなので、77の高さを指定したことに注意してください。これをたとえば 44 に変更できますが、すべての画像ビューで数値を一定に保ちます。最後に、widthToPreserveHAS の最小値は 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;
}

スクリーンショット:

ここに画像の説明を入力

于 2013-08-18T23:19:28.870 に答える