質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

2回答

2107閲覧

AutolayoutをMisterFusionで実装した際に、別ビューとの差での計算がエラーになる

DaikiOgawa

総合スコア15

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/01/29 11:17

編集2022/01/12 10:55

メッセージアプリを作ろうと思い、TextFieldに文字入力をしようとした時はビューを上にずらすという動きを実装しようとしたのですが、MisterFusionの部分でエラーになってしまいます。

参考にしたURL
http://hack.aipo.com/archives/7958/
http://qiita.com/yuto_aka_ike/items/1d0cc3f7bc3aa4d4161a
https://github.com/szk-atmosphere/MisterFusion/blob/master/README.md

Swift2

1import UIKit 2import MisterFusion 3 4class MessageViewController: UIViewController, UITextViewDelegate, UITableViewDelegate{ 5 6 var isObserving = false 7 8 var messageTextViewHeight: NSLayoutConstraint! 9 var messageTextView: UITextView! 10 11 var tableView: UITableView! 12 var underBarView: UIView! 13 var sendBtn: UIButton! 14 15 override func viewWillAppear(animated: Bool) { 16 // Viewの表示時にキーボード表示・非表示を監視するObserverを登録する 17 super.viewWillAppear(animated) 18 if(!isObserving) { 19 let notification = NSNotificationCenter.defaultCenter() 20 notification.addObserver(self, selector: "keyboardWillShow:" 21 , name: UIKeyboardWillShowNotification, object: nil) 22 notification.addObserver(self, selector: "keyboardWillHide:" 23 , name: UIKeyboardWillHideNotification, object: nil) 24 isObserving = true 25 } 26 } 27 override func viewDidLoad() { 28 29 //メッセージ表示テーブルView 30 //let frame_tableView:CGRect = CGRect(x: x, y: y, width: width, height: height) 31 tableView = UITableView() 32 //tableView.backgroundColor = .redColor() 33 //tableView = UITableView() 34 tableView.delegate = self 35 //self.view.addSubview(tableView) 36 37 underBarView = UIView() 38 39 //メッセージ表示テーブルadd 40 self.view.addLayoutSubview(tableView, andConstraints: 41 tableView.Top |-| 0, 42 tableView.Right |-| 0, 43 tableView.Left |+| 0, 44 /* 45 エラーになる部分はじまり 46 */ 47 tableView.Bottom |==| underBarView.Top |-| 0 48 /* 49 エラーになる部分おわり 50 */ 51 52 /* 53 これに変えればエラーにならない はじまり 54 */ 55 //tableView.Bottom |-| 50 56 /* 57 これに変えればエラーにならない おわり 58 */ 59 60 ) 61 print("メッセージ表示テーブルAdd成功") 62 63 //下部裏のView 64 underBarView = UIView() 65 //self.view.addSubview(underBarView) 66 underBarView.frame.size.height = 50 67 underBarView.backgroundColor = UIColor .redColor() 68 69 //メッセージ入力欄 70 messageTextView = UITextView() 71 messageTextView.delegate = self 72 self.underBarView.addSubview(messageTextView) 73 74 //送信ボタン 75 sendBtn = UIButton() 76 messageTextViewHeight = NSLayoutConstraint() 77 self.underBarView.addSubview(sendBtn) 78 79 //下部裏親のViewAdd 80 self.view.addLayoutSubview(underBarView, andConstraints: 81 underBarView.Top |==| tableView.Bottom |+| 0, 82 underBarView.Right |-| 0, 83 underBarView.Left |+| 0, 84 underBarView.Bottom |-| 0 85 ) 86 print("下部親View Add成功") 87 88 } 89 func textViewDidChange(textView: UITextView) { 90 let maxHeight = 80.0 // 入力フィールドの最大サイズ 91 if(messageTextView.frame.size.height.native < maxHeight) { 92 let size:CGSize = messageTextView.sizeThatFits(messageTextView.frame.size) 93 messageTextViewHeight.constant = size.height 94 } 95 } 96 override func viewWillDisappear(animated: Bool) { 97 // Viewの表示時にキーボード表示・非表示時を監視していたObserverを解放する 98 super.viewWillDisappear(animated) 99 if(isObserving) { 100 let notification = NSNotificationCenter.defaultCenter() 101 notification.removeObserver(self) 102 notification.removeObserver(self 103 , name: UIKeyboardWillShowNotification, object: nil) 104 notification.removeObserver(self 105 , name: UIKeyboardWillHideNotification, object: nil) 106 isObserving = false 107 } 108 } 109 func keyboardWillShow(notification: NSNotification?) { 110 // キーボード表示時の動作をここに記述する 111 let rect = (notification?.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() 112 let duration:NSTimeInterval = notification?.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! Double 113 UIView.animateWithDuration(duration, animations: { 114 let transform = CGAffineTransformMakeTranslation(0, -rect.size.height) 115 self.view.transform = transform 116 },completion:nil) 117 } 118 func keyboardWillHide(notification: NSNotification?) { 119 // キーボード消滅時の動作をここに記述する 120 let duration = (notification?.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! Double) 121 UIView.animateWithDuration(duration, animations:{ 122 self.view.transform = CGAffineTransformIdentity 123 }, 124 completion:nil) 125 } 126} 127

TableViewを上にずらしたいので、TableViewのBottomの値を下の文字入力エリアにくっつけるようにしたいのですが、そのようなコードを書くとエラーになってしまいます。

よろしくお願いします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

@u39uedaさんがおっしゃる通りNSLayoutConstraintの仕様上、制約をつけるviewがsuperviewに対してaddSubViewされている状態でないとエラーになります。
またviewをAutoLayoutでレイアウトする場合はframeでのsize指定などを併用しないので、下記のようなコードになります。

swift

1import UIKit 2import MisterFusion 3 4class MessageViewController: UIViewController, UITextViewDelegate, UITableViewDelegate{ 5 6 var isObserving = false 7 8 var messageTextViewHeight: NSLayoutConstraint? 9 var messageTextView = UITextView() 10 11 let tableView = UITableView() 12 let underBarView = UIView() 13 let sendBtn = UIButton() 14 15 override func viewDidLoad() { 16 //メッセージ表示テーブルView 17 tableView.delegate = self 18 19 //メッセージ表示テーブルadd 20 self.view.addLayoutSubview(tableView, andConstraints: 21 tableView.Top, 22 tableView.Right, 23 tableView.Left, 24 ) 25 26 //下部裏のView 27 underBarView.backgroundColor = UIColor .redColor() 28 29 //メッセージ入力欄 30 messageTextView.delegate = self 31 self.underBarView.addSubview(messageTextView) 32 33 //送信ボタン 34 self.underBarView.addSubview(sendBtn) 35 36 //下部裏親のViewAdd 37 self.view.addLayoutSubview(underBarView, andConstraints: 38 underBarView.Top |==| tableView.Bottom, 39 underBarView.Right, 40 underBarView.Left, 41 underBarView.Bottom, 42 underBarView.Height |==| 50 43 ) 44 }

また、質問とは関係のないものとなりますが、propertyが不変でnilでないものであるなら、propertyをletで定義をしてクラスのイニシャライズを始めから行ったほうが良いと思います。

投稿2016/04/05 18:37

marty-suzuki

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

print("下部親View Add成功")
の次に underBarView を上書きしてますがこれのせいではないですか。

追記
よく見るとself.view.addSubview(underBarView)もしていないですね。
self.view.addLayoutSubviewの前に呼んでおかないとダメかもしれません。

投稿2016/01/29 11:31

編集2016/01/30 02:26
u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaikiOgawa

2016/01/30 02:21

ご回答有り難うございます。指摘していただいた部分コメントアウトしてみたのですが、エラー直んないです。。
u39ueda

2016/01/30 02:33

見直して追記しました。これでもエラーが出ますか?
DaikiOgawa

2016/01/31 10:59

ご回答ありがとうございます。消してしまったのですが、addSubviewも実は既に一度試しました…。やはりそれ以外の部分では見当たらないでしょうか?
u39ueda

2016/01/31 15:40 編集

> //メッセージ表示テーブルadd > self.view.addLayoutSubview(tableView, andConstraints: の **前** でaddSubviewするのも試してみましたか? 下の方でコメントアウトされてたのは気がつきましたが。
u39ueda

2016/01/31 15:41

制約を追加する時点で関係するViewが全てaddSubviewされていないとダメだったと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問