Эквивалент iOS для режима видимости Android View.GONE
Я разрабатываю приложение для iOS, и я использую Storyboard с AutoLayout ON. Один из моих контроллеров просмотра имеет набор из 4 кнопок, и в некоторых случаях я хотел бы, чтобы первый из них исчез.
Если я использую метод setHidden:TRUE
, UIButton становится невидимым, но он все же явно занимает пространство в представлении, а результат - это "дыра", которую я не смог заполнить, чтобы оставшаяся UIButton плавала в направлении сверху основного вида.
В Android я бы просто использовал View.GONE
вместо View.INVISIBLE
, но в iOS я застрял в этом поведении, и я не хочу верить, что единственное решение - это вручную (да, я имею в виду программно) переместите остальные элементы в начало.
Я думал, что смог бы сделать это, установив какой-то Constraint, чтобы сделать все таким же автоматическим, как на Android, но мне не повезло.
Прежде чем отключить автоотключение, может ли кто-то указать меня в правильном направлении?
Я использую IB, но мне тоже нравится программный материал.
UPDATE:
Установка высоты компонента в 0 также не помогает.
Я пробовал что-то вроде этого:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
Ответы
Ответ 1
Добавление ограничения (NSLayoutAttributeHeight), которое устанавливает для меня высоту представления 0:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
Ответ 2
добавьте ограничение высоты к вашему представлению следующим образом: ![введите описание изображения здесь]()
затем создайте выход для ограничения высоты в файле viewController следующим образом: ![введите описание изображения здесь]()
& то в вашем методе viewDidLoad измените высоту ограничения на 0 следующим образом:
override func viewDidLoad() {
super.viewDidLoad()
nsLcButtonHeight.constant = 0
}
Ответ 3
Все ответы на эти вопросы неэффективны.
Лучший способ для equvailent Android setVisibility: метод Gone в iOS - это то, что StackView
сначала выбирают компоненты, а затем в редакторе, внедряют, Stack View,
подключить новый вид стека с помощью IBOutlet, затем:
скрытых:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
firstView.hidden = YES;
видимость:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
firstView.hidden = NO;
как использование представления стека, все ограничения будут сохранены!
Документ
Ответ 4
Что вы можете сделать, это группировать свои представления в виде стека. Затем, когда вы скрываете определенный вид, остальные виды будут автоматически сдвинуты, чтобы заполнить пробел.
Возможно, вы захотите проверить документацию Apple на Stack Views:
https://developer.apple.com/reference/uikit/uistackview
или онлайн-уроки, такие как: https://www.appcoda.com/stack-views-intro/
Ответ 5
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];
}
Ответ 6
https://github.com/tazihosniomar/LayoutManager
Надеюсь, это поможет вам.
Ответ 7
Как показало мое исследование, даже 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, поэтому он всегда обновляется.
Ответ 8
Вы также можете очистить страницу или, по крайней мере, определенные ячейки страницы, и переопределить все это. Это быстро и хорошо работает. Я не писал код, но нашел его в этом уже существующем проекте, над которым я работаю. Создайте классы ManagementTableSection
и ManagementTableCell
для управления всем этим. Извините, я не могу предоставить более четкий код.
Ответ 9
Исходя из ответа, предоставленного Deniz, вот решение, использующее ограничения в 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
Ответ 10
Я добавил новое свойство в пользовательскую реализацию 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)
...
}
Ответ 11
Этот вопрос довольно старый, но я обнаружил, что в шкафу установлены дополнительные ограничения (так что представления вокруг "ушедшего" вида знают, что делать, когда он отсутствует).
A which you want to be A
| after setting B to gone |
B C
|
C
Очевидно, что все больше и больше просмотров у вас более сложное, так как вам нужны дополнительные ограничения из каждого представления
Ответ 12
setHidden: TRUE/FALSE является ближайшим эквивалентом Android View.GONE/VISIBLE.
Просмотр не обязательно занимает пространство, если оно не видно!
Я создал ComboBox-Alike со списком ListView поверх других представлений. Я вижу только при выборе:
![enter image description here]()