Thursday, May 3, 2012

UIVew sizeToFit

サイズが特定しづらい UIButton や UIImageView では、sizeToFit を使って frame プロパティを動的に変更するようにしておくとよいです。

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundRect];
btn.textLabel.font = [UIFont systemFontOfSize:14.0];
[btn setTitle:@"文字数が不明なボタンタイトル" forState:UIControlStateNormal];
[btn sizeToFit];
btn.frame = CGRectMake(
    0, 0,
    btn.frame.size.width, btn.frame.size.height
);
...

UIImageView のようにアスペクト比を保ってリサイズしたい場合は

(リサイズ先値) * (希望サイズ値) / (リサイズ元値)

で変更します。

UIImage *img = [UIImage imageNamed:@"unknownImage.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:img];
[imageView sizeToFit];
// 幅100px で比率を保って高さを調整します。
imageView.frame = CGRectMake(
    0, 0, 100,
    imageView.frame.size.height * 100 / imageView.frame.size.width
);
...

サムネイル画像のように固定幅のボックス内でリサイズしたい場合は、contentMode プロパティに UIViewContentModeAspectFit をセットする方法がシンプルです。この方法では中央揃えでマージンが出来ることになります。

UIImage *img = [UIImage imageNamed:@"thumbnail.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:img];
imageView.frame = CGRectMake(0, 0, 50, 50);
imageView.contentMode = UIViewContentModeAspectFit;
....