IOS просматривает видимость
Я новичок в разработке iOS. Я хочу переключать (скрывать/видеть) подвью из родительского представления. В Android-браузере есть способ скрыть видимость, чтобы уйти.
В андроиде
subView.setVisibility(View.GONE);
В iOS
subView.removeFromSuperview()
когда я использую функцию выше, он удаляет subViewConstraints и испортил мои ограничения прокрутки.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
когда я использую вышеуказанный код, он отлично работает и скрывает subView.but, когда я хочу сделать subView видимым, он не показывает subView.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
Надеюсь, ты поймешь мою проблему. Спасибо в Advance.
Ответы
Ответ 1
Поскольку я работал как с iOS, так и с Android, вам нужно играть с ограниченным доступом в ios для обеспечения работы Android. iOS Не поддерживается автоматически, как поддержка Android на основе видимости GONE
и VISIBLE
Вам нужно зацепить outlet
конкретного constraint
(он может вертикально/горизонтально/высота), вам нужно установить его на 0
и вам нужно будет управлять своим пользовательским интерфейсом.
Скрыть:
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()
Приветствие
Ответ 2
Попробуйте это расширение:
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)
}
Вот результат:
![enter image description here]()
Ответ 3
Вы говорите, что хотите скрыть свое подвью и удалить занимаемое им пространство. Если вы хотите избежать беспорядка с ограничениями, вы можете попробовать использовать представления стека:
- Создайте
UIStackView
и установите соответствующие ограничения между представлением стека и его родительским представлением;
- Добавить виды в представление стека;
- Теперь вы можете переключать видимость этих представлений в представлении стека, установив
view.isHidden
в true или false, и макет будет автоматически настраиваться.
Ответ 4
Может быть, вы бы предпочли это решение
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()
}
}
}
Ответ 5
Я считаю, что вы ищете view.isHidden = true
. Это просто скрывает представление на месте без изменения иерархии представлений или сопоставления ограничений. Затем вы можете повторно показать свое мнение. с view.isHidden = false
.
Ответ 6
- Используйте это, когда вы хотите скрыть свой вид: view.isHidden = true
- & когда u хочет показать представление: view.isHidden = false
Ответ 7
Ограничение высоты крюка представления как IBOutlet
Чтобы скрыть
self.viewHeightCon.constant = 0
self.view.layoutIfNeeded()
Чтобы показать
self.viewHeightCon.constant = 300
self.view.layoutIfNeeded()
этим видом скрывается без пробела