web-dev-qa-db-ja.com

Swiftを使用してUIViewの高さをプログラムで増やす方法

IB内には、segmentedControlと2つのcontainerViewsを持つviewControllerがあります。各containerViewには、tableViewがあります。各tableViewからdetailViewをプッシュします。自動レイアウトはIBにあります。

セグメントを選択すると、対応するtableViewが表示され、セルを選択すると、正しいdetailViewがシーンにプッシュされます。

問題は、detailViewがsegmentedControlにプッシュされると、まだ表示されていることです。動作するsegmentedControlを非表示にすることにしましたが、そこには大きな空きスペースがあります。プログラムでdetailViewのビューのサイズを拡大しようとしましたが、拡大していません。私が読んだことから、ストーリーボードで最初の制約を作成したからです。

プログラムでdetailViewのビューを展開するにはどうすればよいですか?

コード:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view's size
 self.view.frame.size.height += 20.0

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
 }

}

エラー:

//Error for the last argument- height: *self.view.frame.height += 20.0*
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

変化演算子の左側は可変ではありません: 'height'は取得のみのプロパティです

//Error for the last argument- *self.view.frame.size.height += 20.0*:
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)

タイプ '(x:Int、y:Int、width:CGFloat、height:())'の引数リストでタイプ 'CGRect'の初期化子を呼び出すことはできません

16
Lance Samaria

詳細ビューの高さ制限用のアウトレットを作成する必要があります。その後、次のようにプログラムで高さを調整できますmyHeightConstraint.constant += extraHeightここで、extraHeightは、詳細ビューの高さを示す数値です。後でself.view.layoutIfNeeded()を呼び出す必要がある場合もあります。

制約からアウトレットを作成するには、ストーリーボードエディターの制約から(UIViewのアウトレットの場合と同様に)コードへのドラッグを制御します。

あなたは正しいです-あなたは自動レイアウトと制約を使用しているため、制約も調整する必要があります。生フレームを設定すると、予期しない動作が発生する可能性があります。他に質問や問題がある場合はお知らせください。

28
CoolPenguin

CGRect初期化子の中では、+=を使用するのではなく、+だけを使用する必要があります。

変化する:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

に:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 20.0)

イニシャライザ内でself.view.frame.heightの値を変更しようとしてはなりません。

12
rmaddy

Swift 4.2

プログラムでサンプルを作成します。

    var flowHeightConstraint: NSLayoutConstraint?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        view.addSubview(button)
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        flowHeightConstraint = button.heightAnchor.constraint(equalToConstant: 30)
        flowHeightConstraint?.isActive = true
    }

    @objc func animateButtonTapped() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
            self.flowHeightConstraint?.constant = 100
            self.view.layoutIfNeeded()
        }, completion: nil)
    }

    lazy var button: UIButton = {
       let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .green
        button.addTarget(self, action: #selector(animateButtonTapped), for: .touchUpInside)
        return button
    }()

このコード行は、ボタンを作成し、タップするとアニメーション付きのボタンの高さを変更します。

このヘルプを期待:)

2
moraei

SegmentedControlに設定された高さの制約はありますか。もしそうであれば、詳細ビューのロード中にそれらを削除することができます。

0
Joe