Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

HomeWork 4.1 Dynamic height with a custom uitableviewcell

yuichi takeda edited this page Mar 25, 2015 · 3 revisions

動的に tableViewCell の高さを変えてみよう。

以下のように、テキストの量によって高さを変える tableView を作ってみましょう。

tableViewSample

この課題では以下のことを調べてください。

plist からデータの読み込み

plist は apple が用いているデータの定義で、XML で記述されているファイルです。

plist

sampleData.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<string>アリストテレス:“垣根”は相手が作っているのではなく、自分が作っている</string>
	<string>夏目漱石:「ああ、ここにおれの進むべき道があった!ようやく掘り当てた!」こういう感投詞を心の底から叫び出される時、貴方がたははじめて心を安んずる事ができるのだろう。</string>
	<string>ブライアン・アダムス:貴方の周りを変えようとしてもほとんど意味がない。まず最初に、自分の信念を変えなさい。そうすれば、貴方の周りのあらゆることがそれに応じて、変わる。</string>
	<string>ドン・シベット:貴方の心からくるものは、人の心を動かす。</string>
	<string>高野泰明:いかんものは、いくら考えてもよくならん。</string>
	<string>豊田佐吉:いくら儲けたいの、いくら儲けねばならんのと、そんな横着な考えでは人間生きてゆけるものではない。</string>
	<string>新渡戸稲造:いわゆる十分に力を出す者に限って、おのれに十二分の力があり、十二分の力を出した者がおのれに十五分の力あることがわかってくる。</string>
	<string>マーフィー:おだやかな心は問題を解決します。怒りにふるえ、悲しみに打ちひしがれ、嫉妬に狂った心は問題をますます混乱させます。問題の解決は心のおだやかな時にしなさい。</string>
	<string>シェイクスピア:お前がそれを抑えつければ抑えつけるほど、ますます燃え上がるよ。静かにささやくように流れていく流れも、せき止められればカンシャクを起こしたように暴れ出すわね。だけどそのさわやかな流れが阻まれなければ、エナメルをかけた石に触れて快い音を奏でるわね。</string>
	<string>ディズニー:しなくちゃいけない仕事には、何か楽しめる要素があるもの。</string>
</array>
</plist>

これを読み込んで NSArray オブジェクトを生成することが出来ます。どのように生成するか調べてみましょう。

文字列から高さを計算する

NSStringのインスタンスメソッド

- (CGRect)boundingRectWithSize:(CGSize)size
                       options:(NSStringDrawingOptions)options
                    attributes:(NSDictionary *)attributes
                       context:(NSStringDrawingContext *)context

を用います。(ドキュメントはこちら- (CGRect)boundingRectWithSize:options:attributes:context:)

引数には以下のように指定します。

  • size : NSStringを描画する最大サイズ. 横幅を固定して縦をできるだけ伸ばす場合は size.width = "固定値"; size.height = CGFLOAT_MAX; のように指定します。
  • options : NSStringを描画するときに利用するオプションです。複数行のテキストを描画する際は NSStringDrawingUsesLineFragmentOrigin を指定します。
  • attrs にはNSStringを描画するときに用いるattributeを指定します。(サイズや、フォントなどが指定できます。詳細ははこちらAttributed String Programming Guideをご覧ください)
  • context : 描画のスケールなどを指定するときに NSStringDrawingContext のインスタンスを渡します。
例)

"夏目漱石:「ああ、ここにおれの進むべき道があった!ようやく掘り当てた!」こういう感投詞を心の底から叫び出される時、貴方がたははじめて心を安んずる事ができるのだろう。"という文字列をフォントサイズ17pt, 最大幅320pt で表示する際の高さを求めます

NSString *string = @"夏目漱石:「ああ、ここにおれの進むべき道があった!ようやく掘り当てた!」こういう感投詞を心の底から叫び出される時、貴方がたははじめて心を安んずる事ができるのだろう。";
CGSize maxSize = CGSizeMake(320, CGFLOAT_MAX);
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0]};
CGRect rect = [string boundingRectWithSize:maxSize
                                   options:NSStringDrawingUsesLineFragmentOrigin
                                attributes:attribute
                                   context:nil];
NSLog(@"%@", NSStringFromCGRect(rect)); // {{0, 0}, {306, 101.405}}

出力結果は、NSStringを描画する最小のサイズになります。UILabelなどのサイズを決める時はceilを使って切り上げます。

sizeOfString.width = ceil(rect.size.width);
sizeOfString.height = ceil(rect.size.height);
NSLog(@"%@", NSStringFromCGSize(sizeOfString)); // {306, 102}

iOS6以前の場合は以下のメソッドを使います。

- (CGSize)sizeWithFont:(UIFont *)font 
     constrainedToSize:(CGSize)size 
         lineBreakMode:(NSLineBreakMode)lineBreakMode;

constrainedToSize に強制的におさめたいサイズを指定するのがみそです。

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally