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'の初期化子を呼び出すことはできません
詳細ビューの高さ制限用のアウトレットを作成する必要があります。その後、次のようにプログラムで高さを調整できますmyHeightConstraint.constant += extraHeight
ここで、extraHeight
は、詳細ビューの高さを示す数値です。後でself.view.layoutIfNeeded()
を呼び出す必要がある場合もあります。
制約からアウトレットを作成するには、ストーリーボードエディターの制約から(UIViewのアウトレットの場合と同様に)コードへのドラッグを制御します。
あなたは正しいです-あなたは自動レイアウトと制約を使用しているため、制約も調整する必要があります。生フレームを設定すると、予期しない動作が発生する可能性があります。他に質問や問題がある場合はお知らせください。
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
の値を変更しようとしてはなりません。
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
}()
このコード行は、ボタンを作成し、タップするとアニメーション付きのボタンの高さを変更します。
このヘルプを期待:)
SegmentedControlに設定された高さの制約はありますか。もしそうであれば、詳細ビューのロード中にそれらを削除することができます。