Как динамически добавлять uibutton и перемещать элементы внизу, чтобы освободить место - PullRequest
1 голос
/ 11 февраля 2012

Идея состоит в том, что пользователь может нажать кнопку «Добавить страну», появится окно выбора страны, и все, что пользователь выберет из средства выбора, будет добавлено как метка / кнопки (удаление из США) под кнопкой «Добавить страну».Эти новые кнопки удаления при нажатии удалят себя и их метки.

Я уже могу получить значение из палитры «Страна» и создать здесь кнопку с помощью кода Как программно создать базовую UIButton?

Моя проблема в том, что кнопка просто располагается поверх существующих элементов.Я хотел бы, чтобы созданные кнопки находились под кнопкой «Добавить страну» или под ранее созданными кнопками.Независимо от того, какой элемент был ранее ниже, кнопка Добавить страну должна сдвинуться вниз.

Я даже не знаю, какие условия поиска мне следует использовать, чтобы зайти в Google.Я думал об использовании uitableview, чтобы содержать только что созданные кнопки, и он как-то расширялся, но мне тоже не повезло с этим.Кстати, я использую раскадровку.

РЕДАКТИРОВАТЬ: Добавлен соответствующий код:

    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // get text of selected option
    NSString *pickedText;
    if ([pickerView tag] == 201) {
        pickedText = [arrCountries objectAtIndex:row];
    }
    else if([pickerView tag] == 202) {
        pickedText = [arrLanguages objectAtIndex:row];
    }

    // create button
    UIButton *countryButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [countryButton addTarget:self
                      action:@selector(removeCountry:)
            forControlEvents:UIControlEventTouchUpInside];
    [countryButton setTitle:pickedText forState:UIControlStateNormal];
    countryButton.frame = CGRectMake(0, 210.0, 160.0, 40.0);
    [self.view addSubview:countryButton];

    // hide picker
    [countryPicker setHidden:YES];
    [languagePicker setHidden:YES];

}

- (void)removeCountry:(UIButton *)countryButton
{
    [countryButton removeFromSuperview];
}

РЕДАКТИРОВАТЬ2: Обновлен код, в котором элементы перемещаются вниз, за ​​исключением ранее динамически добавленной кнопки.

// create button
    UIButton *countryButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [countryButton addTarget:self
                      action:@selector(removeCountry:)
            forControlEvents:UIControlEventTouchUpInside];
    [countryButton setTitle:pickedText forState:UIControlStateNormal];

    CGRect newFrame = addCountryButton.frame;
    newFrame.origin.y = newFrame.origin.y + addCountryButton.frame.size.height + countryButton.frame.size.height;
    countryButton.frame = newFrame;

    [self.view addSubview:countryButton];

    // move elements down
    [elementsBelowAddCountry enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        CGRect newFrame = [obj frame];
        newFrame.origin.y = newFrame.origin.y + countryButton.frame.size.height;
        [obj setFrame:newFrame];
        NSLog(@"object %@", obj);

    }];

    [elementsBelowAddCountry setByAddingObject:countryButton]; 
    // this doesn't work. new countryButton is set on top of previous countryButton

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Мне также нравится опция tableView, она довольно чистая.Вот еще две альтернативы:

Вы можете создать точную копию (B) своего представления (A) в раскадровке, включая новое подпредставление (countryButton) в B со всем остальным, перемещенным вниз.Затем, когда пользователь выбирает добавить страну в A, переход (переход) к B с постепенным исчезновением (не смущающий толчок).Проблема обслуживания заключается в том, что каждый раз, когда вы обновляете представление A, вам также необходимо помнить об обновлении B.Еще одна приятная вещь с этой опцией состоит в том, что вы можете изменить интервал между строками, если хотите (чтобы ничего не перемещать за пределы экрана).

Еще одна альтернатива для одного просмотра - сохранить набор всех элементов,хотите переместить, если нажата addCountry (создайте список в viewDidLoad).Когда выбрано, перечислите объекты с enumerateObjectsUsingBlock: с чем-то вроде этого:

CGRect newFrame = self.frame;
newFrame.origin.y = newFrame.origin.y + countryButton.frame.size.height + 10;
self.frame = newFrame;

Если countryButton удален, сделайте то же самое, за исключением уменьшения y.

Я вроде как 2-й вариант,Это тоже хорошо, потому что, если вы поместите перечисление в живой блок, оно будет выглядеть гладко.

Наслаждайтесь,

Дэмиен

0 голосов
/ 11 февраля 2012

Я могу предложить вам два способа сделать это:

  1. Самый простой способ - добавить его в представление таблицы, чтобы каждый раз, когда пользователь добавлял страну, вы перезагружали данные таблицы.поэтому он сразу появится в таблице, и я предпочитаю этот, поскольку табличное представление поддерживает редактирование и удаление функций строк.

  2. вы можете сохранить точку y для последнего элемента управления (в вашемв случае метки), поэтому в следующий раз, когда пользователь добавит страну, легко вычислить, где должна быть рамка следующей метки.

0 голосов
/ 11 февраля 2012
UIButton *yourOriginalButtom;

UIButton *newButton = [[UIButton alloc] initWithFrame:yourFrame]; /* or use UIButton *newButton = [UIButton buttonWithType:UIButtonTypeCustom]; or UIButtonTypeRoundedRect */
newButton.center = CGPointMake(yourOriginalButtom.center.x, yourOriginalButtom.center.y+newButton.frame.size.height/2 + 15);
[newButton setTitle:@"New button" forState:UIControlStateNormal];
newButton.backgroundColor = [UIColor whiteColor]; // this will only work on custom buttons
[self.view addSubview:newButton];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...