Подтвердить что ты не робот

Эквивалент 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;
4b9b3361

Ответ 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];

}

Ответ 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                               
  • Установите ограничение более низкого приоритета (750) с C на A.
  • Добавьте B верхние и нижние ограничения (или влево и вправо, если вы хотите, чтобы ваше представление сворачивалось горизонтально) в массив NSLayoutConstraint bConstraints. Сделайте это:
    • Управляйте нажатием и перетаскиванием из ограничения на ViewController
    • Изменить соединение из Outlet в Outlet Collection
    • Для имени bConstraints.
    • Хит подключится. Это создаст @IBOutlet var bConstraints: [NSLayoutConstraint]! в вашем ViewController
    • Чтобы добавить дополнительные ограничения: перетащите из ограничения в Storyboard в имя переменной @IBOutlet
  • Затем скройте B

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  • Чтобы отобразить

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

Очевидно, что все больше и больше просмотров у вас более сложное, так как вам нужны дополнительные ограничения из каждого представления

Ответ 12

setHidden: TRUE/FALSE является ближайшим эквивалентом Android View.GONE/VISIBLE.

Просмотр не обязательно занимает пространство, если оно не видно!

Я создал ComboBox-Alike со списком ListView поверх других представлений. Я вижу только при выборе:

enter image description here