Использование UISegmentedControl в качестве кнопки - PullRequest
7 голосов
/ 16 июля 2010

В моем коде я использую UISegmentedControl в качестве «кнопки» только с ОДНЫМ сегментом, а свойство momentary установлено на YES.В версиях SDK до iOS 4 это не было проблемой, но, похоже, теперь iOS 4 требует, чтобы было как минимум 2 сегмента.Следующий код вызывает исключение:

NSArray *titles = [NSArray arrayWithObject:@"Button Title"];
myButton = [[UISegmentedControl alloc] initWithItems:titles];

, и теперь в Интерфейсном Разработчике вы даже не можете создать UISegmentedControl с менее чем 2 сегментами.При сборке регистрируется следующая ошибка:

"Свойство количества сегментов сегментированного элемента управления должно быть больше или равно 2."

Я немного озадачен.Есть ли обходные пути для этого?Я попытался создать UISegmentedControl с двумя кнопками, а затем удалить одну программно, и это «работает», поскольку это не вызывает сбой приложения.Я получаю кнопку в iOS 3 и ничего в iOS 4. Есть идеи?

Ответы [ 8 ]

7 голосов
/ 10 августа 2010

Вы пробовали это:

[myButton removeAllSegments];
[myButton insertSegmentWithTitle:@"Press this" atIndex:0 animated:NO];
6 голосов
/ 22 августа 2010

Действительно странно.Он по-прежнему прекрасно работает как в симуляторе iOS4, так и на устройстве (это настоящий рабочий фрагмент из моего кода):

NSArray *laterContent = [NSArray arrayWithObjects: @"Maybe later", nil];
UISegmentedControl *later = [[UISegmentedControl alloc] initWithItems:laterContent];
CGRect frame = CGRectMake(  20,
                          98,
                          self.alert.bounds.size.width/2 - 30,
                          30);

later.frame = frame;

later.selectedSegmentIndex = -1;

[later addTarget:self action:@selector(laterAction:) forControlEvents:UIControlEventValueChanged];

later.segmentedControlStyle = UISegmentedControlStyleBar;
later.tintColor = [UIColor colorWithRed:130.0f/255.0f green:74.0f/255.0f blue:54.0f/255.0f alpha:0.8f];
later.momentary = YES;
later.alpha = 0.9;
3 голосов
/ 23 августа 2010

Это не совсем решение, связанное с кодом, но: я столкнулся с похожей проблемой и в итоге нарисовал свои собственные похожие ресурсы в Photoshop. Это было не очень сложно сделать и убрало особый неприятный «запах кода», ИМО.

1 голос
/ 26 октября 2013

Редактор в Интерфейсном Разработчике не позволит вам изменить количество сегментов меньше 1, но вы можете сделать сегментированный элемент управления в IB, отредактировав .xib xml вручную.

  1. Щелкните правой кнопкой мыши на .xib, содержащем сегментированный элемент управления
  2. Выберите Open As -> Source Code во всплывающем меню.
  3. Найти "<segments>, который является началом массива xml сегментов. Все это должно выглядеть следующим образом:

    <segments>
        <segment title="Segment 1 Title"/>
        <segment title="Segment 2 Title"/>
    </segments>
    
  4. Просто удалите <segment title="Segment 2 Title"/>, чтобы был только один элемент сегмента.

  5. Снова щелкните правой кнопкой мыши на .xib и выберите Open As -> Interface Builder - iOS, чтобы вернуться к построителю интерфейса.

Вам также, вероятно, следует установить сегментированный элемент управления в «мгновенный» режим.

Я не получаю никаких ошибок при компиляции или запуске этого. Конечно, это взлом, и может привести к поломке в некоторых обстоятельствах или в будущем выпуске iOS.

1 голос
/ 18 июля 2013

Я обнаружил, что если у вас есть предыдущий проект с односегментным UISegmentedControl, вы можете открыть как этот проект, так и новый в Интерфейсном Разработчике и перетащить (или скопировать / вставить) односегментный UISegmentedControl в новый контроллер представления.Он будет отлично работать как в вашем приложении, так и в Интерфейсном Разработчике, просто не меняйте количество сегментов с 1 на что-либо еще, так как он не позволит вам вернуться назад.Я использую Xcode 4.6.2 и iOS 6.

0 голосов
/ 14 июля 2014

Вы также можете использовать removeSegmentAtIndex:animated:. Если вы создаете сегментированный элемент управления в раскадровке или XIB с двумя сегментами, вы можете удалить один из них следующим образом:

[self.sortButton removeSegmentAtIndex:1 animated:NO];
0 голосов
/ 11 августа 2010

В iOS 4 нет обходного пути. Если вам нужна эта функциональность, отправьте сообщение об ошибке (запрос на улучшение) на bugreport.apple.com .

0 голосов
/ 08 августа 2010

Ну две возможности:

1) Создайте кнопку и установите фоновое изображение как одну точку UISegmentedControl

Если ваш SegmentedControl является переменной класса, просто замените @ property

@property (nonatomic, retain) IBOutlet UIButton *button;

В функцию viewDidLoad добавьте следующее

-(void) viewDidLoad
{
    [super viewDidLoad];
    ...
    self.button = [UIButton alloc] init];
    [self.button setBackgroundImage:[UIImage imageNamed:@"segmentedDot.png"] forState:(UIControlState)UIControlStateNormal];
}

2) Установите количество сегментов в три из вашего UISegmentedControl, а затем установите ширину в 20 - теперь будет отображаться только точка в середине. Не забывайте, если пользователь взаимодействует с UISegmentedControl, снова установите currentElement для второго сегмента, иначе точка будет светло-серой, а не белой.

3) Поместите кнопку или небольшой вид поверх нежелательной второй точки UISegmentedControl в InterfaceBuilder. Убедитесь, что цвет фона ровный. При использовании кнопки установите для состояния «взаимодействие с пользователем» в инспекторе атрибутов значение «отключено». В качестве типа я бы выбрал «custom», так как у вас не будет границ в вашей кнопке;) Теперь мужчина снова уверен, что первая точка всегда является активным элементом.

Однако я думаю, что первым решением должно стать то, как вы должны поступить, поскольку Apple что-то об этом думала, когда они отключили 1-точечный SegmentedControl. Поскольку вы используете элемент управления в качестве кнопки, элемент, который вы ищете, должен быть кнопкой. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...