私はiOS開発の初心者です。親ビューからサブビューを切り替え(非表示/表示)したいです。Androidには、表示を非表示にする方法があります。
Androidで
subView.setVisibility(View.GONE);
IOSで
subView.removeFromSuperview()
上記の関数を使用すると、subViewConstraintsが削除され、スクロールビューの制約が台無しになります。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
上記のコードを使用すると、うまく動作し、subView.hideが非表示になりますが、subViewを表示したい場合、subViewは表示されません。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
あなたが私の問題を理解することを願っています。事前に感謝します。
IOSとAndroidの両方で作業したので、iOSで制約アウトレットを使用してAndroid機能します。iOSはAndroid native可視性のサポートGONE
&VISIBLE
特定のoutlet
(垂直/水平/高さ)のconstraint
をフックする必要があります。0
に設定し、UIを管理する必要があります。
非表示にする:
self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()
表示するには:
self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()
注:上記の制約の更新が原因で他の制約が影響を受ける場合、以下も呼び出す必要があります。
self.yourView.setNeedsUpdateConstraints()
乾杯
この拡張機能を試してください:
extension UIView {
func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
constraint.constant = gone ? 0.0 : dimension
self.layoutIfNeeded()
self.isHidden = gone
}
}
}
//使用方法...
@IBOutlet weak var testView: UIView?
@IBAction func testVisibilty(switchbutton: UISwitch) -> Void {
let viewHeight:CGFloat = switchbutton.isOn ? 100 : 0.0
self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewHeight)
// set visibility for width constraint
//let viewWidth:CGFloat = switchbutton.isOn ? 300 : 0.0
//self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewWidth, attribute: .width)
}
結果は次のとおりです。
たぶん、あなたはこの解決策を好むでしょう
extension UIView {
enum Visibility {
case visible
case invisible
case gone
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
if let constraint = constraint, constraint.isActive {
return .gone
} else {
return self.isHidden ? .invisible : .visible
}
}
set {
if self.visibility != newValue {
self.setVisibility(newValue)
}
}
}
private func setVisibility(_ visibility: Visibility) {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
switch visibility {
case .visible:
constraint?.isActive = false
self.isHidden = false
break
case .invisible:
constraint?.isActive = false
self.isHidden = true
break
case .gone:
if let constraint = constraint {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 0)
self.addConstraint(constraint)
constraint.isActive = true
}
}
}
}
使用法は次のとおりです。
someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone
編集:
能力の向上:「可視性状態」のストーリーボード(単に「可視」、「不可視」、「消失」と書く)から機能します。
ビュー内のすべての制約は1000未満でなければなりません
extension UIView {
enum Visibility: String {
case visible = "visible"
case invisible = "invisible"
case gone = "gone"
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
if let constraint = constraint, constraint.isActive {
return .gone
} else {
return self.isHidden ? .invisible : .visible
}
}
set {
if self.visibility != newValue {
self.setVisibility(newValue)
}
}
}
@IBInspectable
var visibilityState: String {
get {
return self.visibility.rawValue
}
set {
let _visibility = Visibility(rawValue: newValue)!
self.visibility = _visibility
}
}
private func setVisibility(_ visibility: Visibility) {
let constraints = self.constraints.filter({$0.firstAttribute == .height && $0.constant == 0 && $0.secondItem == nil && ($0.firstItem as? UIView) == self})
let constraint = (constraints.first)
switch visibility {
case .visible:
constraint?.isActive = false
self.isHidden = false
break
case .invisible:
constraint?.isActive = false
self.isHidden = true
break
case .gone:
self.isHidden = true
if let constraint = constraint {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 0)
// constraint.priority = UILayoutPriority(rawValue: 999)
self.addConstraint(constraint)
constraint.isActive = true
}
self.setNeedsLayout()
self.setNeedsUpdateConstraints()
}
}
}
サブビューを非表示にし、サブビューが占有しているスペースを削除するとします。制約の混乱を避けたい場合は、スタックビューを使用してみてください。
UIStackView
を作成し、スタックビューとその親ビューの間に適切な制約を設定します。view.isHidden
をtrueまたはfalseに設定することで、スタックビュー内でこれらのビューの表示を切り替えることができ、レイアウトが自動的に調整されます。view.isHidden = true
を探していると思います。これは、ビュー階層または制約マッピングを変更せずに、ビューを適切に非表示にします。その後、ビューを再表示できます。 view.isHidden = false
で。