AndroidからはじめるiOS

AndroiderがiOSアプリ開発に挑戦するメモ

UILabelの高さ可変とUIScrollViewでハマった件

UILabelはAndroidのTextViewでwrap_contentのように勝手に高さ可変にはなってくれない!

UILabelの高さを合わせる方法は、自分で高さを計算してセットする方法と、sizeToFitを使用する方法がある。
今回はsizeToFitを使用した方法を紹介する。

//
//  MMViewController.m
//  MochiMochiSample
//
//  Created by mochico 2014/06/10.
//  Copyright (c) 2014年 mochico. All rights reserved.
//

#import "MMViewController.h"

@interface MMViewController ()

@property UILabel *flexibleHeightLabel;

@end

@implementation MMViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *dummyText = @"どう考えても一行の幅に納まらない長いテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト";
    _flexibleHeightLabel = [[UILabel alloc] initWithFrame:CGRectMake(
                                                                      0
                                                                      , 0
                                                                      , 280
                                                                      , 5000)]; // 適当な高さ
    [_flexibleHeightLabel setLineBreakMode:NSLineBreakByWordWrapping];  // 改行設定
    [_flexibleHeightLabel setNumberOfLines:0];  // 行数指定。0で指定なし
    [_flexibleHeightLabel setText:dummyText];   // sizeToFitより前にテキストをセットする
    [_flexibleHeightLabel sizeToFit];   // テキストの量に応じて高さを変える

    [_scrollView addSubview:_flexibleHeightLabel];   // storyboardからドラッグしてきたscrollView
}

ここで問題はstoryboard、xibから作成したUILabelでは、
AutoLayout指定で下側のconstraintを指定しなければsizeToFitが効かないということ。
ScrollView内のcontentsにconstraintを設定する方法がなさそう、かつ、
UIScrollViewはcontentSizeを正しく設定しないとスクロールしないので、 可変にしたいUILabelはコード上で生成し高さを計算してcontentSizeを設定することになる。
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    _scrollView.contentSize = CGSizeMake(_scrollView.contentSize.width, CGRectGetMaxY(_flexibleHeightLabel.frame));
}

initWithNibNameでLabelをScrollViewのsubViewに追加しているのでviewDidLayoutSubviewsで高さが決定される。
CGRectGetMaxYで最後のView.frameの高さを取得しcontentSizeに設定する。


【参考URL】
http://9ensan.com/blog/smartphone/iphone/iphone-uilabel-height-calc/
UILabelで高さを動的に変えるには - 3分クッキング
Storyboard上の設定でUILabelを動的に変化させる - makoラボ