Я разрабатываю приложение для iOS, и я использую Storyboard с включенным AutoLayout. Один из моих контроллеров представления имеет набор из 4 кнопок, и в определенных обстоятельствах я бы хотел, чтобы первая исчезла.
Если я использую этот setHidden:TRUE
метод, UIButton становится невидимым, но очевидно, что он занимает место в представлении, и в результате возникает «дыра», которую я не смог заполнить, заставляя оставшуюся UIButton плавать в верхней части основного представления.
В Android я бы просто использовал View.GONE
вместо View.INVISIBLE
, но в iOS я застрял с таким поведением, и я не хочу верить, что единственное решение - вручную (да, я имею в виду программно) переместить оставшиеся элементы вверх.
Я думал, что смогу сделать это, установив какое-то ограничение, чтобы сделать все таким же автоматическим, как в Android, но мне не повезло.
Может ли кто-нибудь указать мне правильное направление, прежде чем я выключу автопрокладку?
Я использую IB, но мне также нравится программировать.
ОБНОВИТЬ:
Установка высоты компонента на 0 тоже не помогает.
Я пробовал примерно так:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
Ответы:
Добавление ограничения (NSLayoutAttributeHeight), которое устанавливает высоту представления равным 0, сработало для меня:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
источник
self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
Unable to simultaneously satisfy constraints
. в то время как у меня уже были ограничения для просмотра. Я решаю это с помощью stackoverflow.com/a/38625419/1270901Все ответы на этот вопрос неэффективны. Лучший способ использовать метод setVisibility: Gone для Android в iOS - это
StackView
сначала выбрать компоненты, затем в редакторе, встроить, просмотреть стек,подключите новое представление стека с IBOutlet, затем:
скрыто:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = YES;
видимость:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = NO;
при использовании представления стека все ограничения будут сохранены!
Документ
источник
добавьте ограничение высоты для вашего представления следующим образом:
затем сделайте выход для ограничения высоты в вашем файле viewController следующим образом:
& затем в вашем методе viewDidLoad измените высоту ограничения на 0 следующим образом:
override func viewDidLoad() { super.viewDidLoad() nsLcButtonHeight.constant = 0 }
источник
Для достижения функциональности Androids.GONE на iOS необходимо использовать UIStackView. После этого спрячьте ребенка по положению. ( Документация по яблокам )
SWIFT 4:
let firstView = cell.rootStackView.arrangedSubviews[0] firstView.isHidden = true // first view gone
Это пример ячейки таблицы, просто поместите обе внутренности
Stack view
и получите предмет дляGONE
ребенка.источник
Что вы можете сделать, так это сгруппировать свои представления в виде стека. Затем, когда вы скрываете определенный вид, остальные виды будут автоматически сдвинуты, чтобы заполнить пространство.
Вы можете проверить документацию Apple по просмотрам стека: https://developer.apple.com/reference/uikit/uistackview
или онлайн-руководства, такие как: https://www.appcoda.com/stack-views-intro/
источник
1) Если ваши кнопки расположены вертикально, вы должны установить
height
значение 0, а в случае горизонтального расположения кнопок попробуйте установитьwidth
значение 0 или вы можете установить оба значения в 0.ИЛИ ЖЕ
2) вы можете попробовать этот подход, который устанавливает
button2
поверхbutton1
:- (void)viewDidLoad { [super viewDidLoad]; UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button1 setTitle:@"hello" forState:UIControlStateNormal]; UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button2 setTitle:@"world" forState:UIControlStateNormal]; [button1 sizeToFit]; [button2 sizeToFit]; [button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)]; [self.view addSubview:button1]; [self.view addSubview:button2]; }
источник
https://github.com/tazihosniomar/LayoutManager
я надеюсь, это поможет тебе.
источник
Этот вопрос довольно старый, но я обнаружил, что в шкафу устанавливаются дополнительные ограничения (так что представления вокруг "пропавшего" представления знают, что делать, если оно отсутствует)
A which you want to be A | after setting B to gone | B C | C
bConstraints
. Сделайте это:bConstraints
.@IBOutlet var bConstraints: [NSLayoutConstraint]!
в вашем ViewControllerЗатем спрячьте B
B.hidden = true NSLayoutConstraint.deactivateConstraints(bConstraints)
Показать
B.hidden = false NSLayoutConstraint.activateConstraints(bConstraints)
Очевидно, что чем больше и больше у вас представлений, тем сложнее это становится, так как вам нужны дополнительные ограничения для каждого представления.
источник
Outlet
наOutlet Collection
. Для дополнительных ограничений перетащите ctrl прямо к имени переменной. Я могу загрузить снимки позже сегодня (примерно через 8 часов)Как показали мои исследования, даже AutoLayout не может вам помочь. Вы должны вручную заменить представления, на которые влияет необязательный показанный компонент (в моем случае, все представления в нижней части необязательного представления, но вы, я уверен, вы можете адаптировать это для обработки всех кнопок справа от необязательной кнопки ):
- (IBAction)toggleOptionalView:(id)sender { if (!_expanded) { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = YES; } else { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = NO; } }
Рекомендуется не указывать жестко высоту / ширину дополнительных компонентов, иначе ваш код ломается каждый раз, когда вы редактируете XIB / Storyboard. У меня есть поле float _optionalHeight, которое я установил в viewDidLoad, поэтому оно всегда актуально.
источник
Вы также можете очистить страницу или, по крайней мере, определенные ячейки страницы и переопределить все это. Это быстро и хорошо работает. Я не писал код, но нашел его в уже существующем проекте, над которым я работаю. Создание
ManagementTableSection
иManagementTableCell
классы для управления все это. Извините, я не могу предоставить более точный код.источник
Основываясь на ответе Дениз, вот решение с использованием ограничений в Swift
Например: если у вас есть 3 вида, A_view B_view и C_view, выровненные по вертикали в указанном порядке, и вы хотите «Скрыть» B, а также отрегулировать разницу, добавьте ограничение.
B_view.removeFromSuperView() var constr = NSLayoutConstraint(item: C_view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: A_view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 20) view.addConstraint(constr)
Константа - это (в данном случае) расстояние по вертикали между C_view и A_view
источник
Я добавил новое свойство в пользовательскую реализацию UIView под названием «visible», которое, если установлено значение false, добавляет ограничение для свертывания представления (я добавил только ограничение ширины, поскольку мой список горизонтальный, но лучшим способом может быть добавление ограничение высоты также 0).
var visible:Bool = true{ didSet{ if(visible){ clipsToBounds = false; removeConstraint(hideConstraint!) }else{ clipsToBounds = true addConstraint(hideConstraint!) } } }
Вам нужно инициализировать ограничение нулевой ширины в представлении и добавить его как поле:
private var hideConstraint:NSLayoutConstraint? func someInitFunction(){ hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0) ... }
источник
setHidden: TRUE / FALSE - ближайший эквивалент Android View.GONE / VISIBLE.
Вид не обязательно занимает место, если его не видно!
Я сделал ComboBox-Alike с ListView, лежащим поверх других представлений. Я виден только при выборе:
источник