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

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

ただいまの
回答率

90.51%

  • Swift

    8756questions

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

  • Swift 2

    1339questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 960

DaikiOgawa

score 9

メッセージアプリを作ろうと思い、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

import UIKit
import MisterFusion

class MessageViewController: UIViewController, UITextViewDelegate, UITableViewDelegate{

    var isObserving = false

    var messageTextViewHeight: NSLayoutConstraint!
    var messageTextView: UITextView!

    var tableView: UITableView!
    var underBarView: UIView!
    var sendBtn: UIButton!

    override func viewWillAppear(animated: Bool) {
        // Viewの表示時にキーボード表示・非表示を監視するObserverを登録する
        super.viewWillAppear(animated)
        if(!isObserving) {
            let notification = NSNotificationCenter.defaultCenter()
            notification.addObserver(self, selector: "keyboardWillShow:"
                , name: UIKeyboardWillShowNotification, object: nil)
            notification.addObserver(self, selector: "keyboardWillHide:"
                , name: UIKeyboardWillHideNotification, object: nil)
            isObserving = true
        }
    }
    override func viewDidLoad() {

        //メッセージ表示テーブルView
        //let frame_tableView:CGRect = CGRect(x: x, y: y, width: width, height: height)
        tableView = UITableView()
        //tableView.backgroundColor = .redColor()
        //tableView = UITableView()
        tableView.delegate = self
        //self.view.addSubview(tableView)

        underBarView = UIView()

        //メッセージ表示テーブルadd
        self.view.addLayoutSubview(tableView, andConstraints:
            tableView.Top |-| 0,
            tableView.Right |-| 0,
            tableView.Left  |+| 0,
        /*
        エラーになる部分はじまり
        */
            tableView.Bottom |==| underBarView.Top |-| 0
        /*
        エラーになる部分おわり
        */

        /*
        これに変えればエラーにならない はじまり
        */
            //tableView.Bottom |-| 50
        /*
        これに変えればエラーにならない おわり
        */

        )
        print("メッセージ表示テーブルAdd成功")

        //下部裏のView
        underBarView = UIView()
        //self.view.addSubview(underBarView)
        underBarView.frame.size.height = 50
        underBarView.backgroundColor = UIColor .redColor()

        //メッセージ入力欄
        messageTextView = UITextView()
        messageTextView.delegate = self
        self.underBarView.addSubview(messageTextView)

        //送信ボタン
        sendBtn = UIButton()
        messageTextViewHeight = NSLayoutConstraint()
        self.underBarView.addSubview(sendBtn)

        //下部裏親のViewAdd
        self.view.addLayoutSubview(underBarView, andConstraints:
            underBarView.Top |==| tableView.Bottom |+| 0,
            underBarView.Right |-| 0,
            underBarView.Left  |+| 0,
            underBarView.Bottom |-| 0
        )
        print("下部親View Add成功")

    }
    func textViewDidChange(textView: UITextView) {
        let maxHeight = 80.0  // 入力フィールドの最大サイズ
        if(messageTextView.frame.size.height.native < maxHeight) {
            let size:CGSize = messageTextView.sizeThatFits(messageTextView.frame.size)
            messageTextViewHeight.constant = size.height
        }
    }
    override func viewWillDisappear(animated: Bool) {
        // Viewの表示時にキーボード表示・非表示時を監視していたObserverを解放する
        super.viewWillDisappear(animated)
        if(isObserving) {
            let notification = NSNotificationCenter.defaultCenter()
            notification.removeObserver(self)
            notification.removeObserver(self
                , name: UIKeyboardWillShowNotification, object: nil)
            notification.removeObserver(self
                , name: UIKeyboardWillHideNotification, object: nil)
            isObserving = false
        }
    }
    func keyboardWillShow(notification: NSNotification?) {
        // キーボード表示時の動作をここに記述する
        let rect = (notification?.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        let duration:NSTimeInterval = notification?.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! Double
        UIView.animateWithDuration(duration, animations: {
            let transform = CGAffineTransformMakeTranslation(0, -rect.size.height)
            self.view.transform = transform
            },completion:nil)
    }
    func keyboardWillHide(notification: NSNotification?) {
        // キーボード消滅時の動作をここに記述する
        let duration = (notification?.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! Double)
        UIView.animateWithDuration(duration, animations:{
            self.view.transform = CGAffineTransformIdentity
            },
            completion:nil)
    }
}

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

よろしくお願いします。

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/30 11:21

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

    キャンセル

  • 2016/01/30 11:33

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

    キャンセル

  • 2016/01/31 19:59

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

    キャンセル

  • 2016/02/01 00:39 編集

    > //メッセージ表示テーブルadd
    > self.view.addLayoutSubview(tableView, andConstraints:

    の **前** でaddSubviewするのも試してみましたか?
    下の方でコメントアウトされてたのは気がつきましたが。

    キャンセル

  • 2016/02/01 00:41

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

    キャンセル

0

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

import UIKit
import MisterFusion

class MessageViewController: UIViewController, UITextViewDelegate, UITableViewDelegate{

    var isObserving = false

    var messageTextViewHeight: NSLayoutConstraint?
    var messageTextView = UITextView()

    let tableView = UITableView()
    let underBarView = UIView()
    let sendBtn = UIButton()

    override func viewDidLoad() {
        //メッセージ表示テーブルView
        tableView.delegate = self

        //メッセージ表示テーブルadd
        self.view.addLayoutSubview(tableView, andConstraints:
            tableView.Top,
            tableView.Right,
            tableView.Left,
        )

        //下部裏のView
        underBarView.backgroundColor = UIColor .redColor()

        //メッセージ入力欄
        messageTextView.delegate = self
        self.underBarView.addSubview(messageTextView)

        //送信ボタン
        self.underBarView.addSubview(sendBtn)

        //下部裏親のViewAdd
        self.view.addLayoutSubview(underBarView, andConstraints:
            underBarView.Top |==| tableView.Bottom,
            underBarView.Right,
            underBarView.Left,
            underBarView.Bottom,
            underBarView.Height |==| 50
        )
    }

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8756questions

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

  • Swift 2

    1339questions

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