iPhone: UISegmentedControl с пользовательскими изображениями в нажатом состоянии - PullRequest
5 голосов
/ 10 сентября 2010

Я использую UISegmentedControl с некоторыми пользовательскими изображениями:

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"0.png"] atIndex:0 animated:NO];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"1.png"] atIndex:1 animated:NO];
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"2.png"] atIndex:2 animated:NO];
segmentedControl.frame = CGRectMake(0, 0, 90, 30);
[self.view addSubview:segmentedControl];
[segmentedControl release];

Эта часть отлично работает. Но он все еще использует стиль Apple для контроля и просто добавляет мои изображения поверх него. Есть ли способ, которым мне не нужно использовать стили Apple, и настраивать контроль с моими собственными изображениями без фона? Я также хотел бы иметь свои собственные "выбранные" изображения состояния.

Возможно

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Nic,

Поработав с этим некоторое время, я решил просто "накатить свое".

Я сделал несколько изображений кнопок в фотошопе, и все получилось как сегментированный элемент управления Затем я установил другое изображение для «выбранных» состояний всех кнопок. Когда одна кнопка была нажата, я вызвал setSelected: NO для других. Затем я справился со всем, что мне нужно было сделать.

Я бы хотел услышать другие решения.

0 голосов
/ 29 октября 2013

В дополнение к ответу DexterW. Я пришел к тому же решению - подражать UISegmentedControl, используя только UIButtons.
Однако это не простая задача, чтобы имитировать UISegmentControl. Я попытался использовать Selected состояние UIButton, но UIButton не будет работать должным образом, если установить одинаковые настройки (bg image, color font) для состояний Hightlighted и Selected. В том случае, когда сегмент выглядит выделенным, он все еще визуально «нажимается». Итак, чтобы избежать этого и сделать набор кнопок более похожим на UISegmentedControl, я вообще не использовал состояние selected. Вместо этого Id решил изменить внешний вид выбранной кнопки в коде так, чтобы состояния normal и highlighted визуально были одинаковыми для выбранной кнопки и отличались для невыбранной.
Предположим, у меня есть 3 кнопки segmentedControl (LeftSgm | MiddleSgm | RightSgm), и для нормального состояния я использую изображение bg с именем «gment_default »и цвет шрифта белый, а для выбранного состояния его изображение bg с именем «gment_active» и черный шрифт. Так в onTouchDown:

-(IBAction)onTopMenuTap:(id)sender
{
    int newSelectedSegmentIndex;
    if (sender == btnLeftSgm)
        newSelectedSegmentIndex=0;
    else if (sender == btnMiddleSgm)
        newSelectedSegmentIndex=1;
    else if (sender == btnRightSgm)
        newSelectedSegmentIndex=2;
    else
        return;

    NSLog(@"Tapped segment index %d while old one is %d",newSelectedSegmentIndex,selectedSegmentIndex);

    if (newSelectedSegmentIndex==selectedSegmentIndex)
        return;

    [self handleSegmentAppearenace:newSelectedSegmentIndex];
//do whatever its need to be done
...
}

и вызываемый метод

-(void)handleSegmentAppearenace:(int)newSelectedSegmentIndex
{
    if (selectedSegmentIndex==0){
        [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_left"] forState:UIControlStateNormal];
        [btnLeftSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnLeftSgm.highlighted = NO;
    }
    else if (selectedSegmentIndex==1){
        [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_center"] forState:UIControlStateNormal];
        [btnMiddleSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnMiddleSgm.highlighted = NO;
    }
    else if (selectedSegmentIndex==2){
        [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_right"] forState:UIControlStateNormal];
        [btnRightSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        btnRightSgm.highlighted = NO;
    }

    if (newSelectedSegmentIndex==0){
        [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_left"] forState:UIControlStateNormal];
        [btnLeftSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnLeftSgm.highlighted = YES;
    }
    else if (newSelectedSegmentIndex==1){
        [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_center"] forState:UIControlStateNormal];
        [btnMiddleSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnMiddleSgm.highlighted = YES;
    }
    else if (newSelectedSegmentIndex==2){
        [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_right"] forState:UIControlStateNormal];
        [btnRightSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btnRightSgm.highlighted = YES;
    }
}

Все три кнопки привязаны в IB к соответствующим свойствам (btnRightSgm и т. Д.). Также для «события касания» связано onTopMenuTap.
Не могу сказать, что это лучшая идея, но она отлично работает для меня.

...