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

Использовать iOS 6 Style Segmented Control в iOS 7?

Возможно ли, чтобы сегментированный элемент управления на устройстве iOS 7 отображался как версия управления iOS 6?

Мы действительно не готовы к редизайну интерфейса, и новый плоский элемент управления не превзойдет остальные наши интерфейсы. Наверняка было бы лучше сохранить стиль iOS 6, если это возможно.

Чтобы уточнить, я компилирую с помощью базового SDK iOS 6.1 Base. Я знаю, что это "очевидный" ответ на мой вопрос, но он не работает. Большинство других элементов пользовательского интерфейса будут отображаться с помощью стилей iOS 6, делая это, но, как и UIAlertView и UIActionSheet, UISegmentedControl нет. Однако, в отличие от UIAlertView и UIActionSheet, UISegmentedControls не чувствуют себя как "системный" элемент; они должны иметь возможность отображать в режиме iOS 6.

Изменить: я думал, что было бы полезно, если бы я, наконец, включил картинку с этим (вероятно, должен был сделать это с самого начала). Однако ответ, который я дал, устранил проблему. Кроме того, в ретроспективе, похоже, что этот может быть стилем iOS 6, он просто выглядит так неправильно, что он выглядит как стиль iOS 7.

enter image description here

4b9b3361

Ответ 1

Мне удается сделать довольно хорошую работу по решению этой проблемы, установив все атрибуты вручную, но это не совсем идеально.

Вот что я сделал:

- (void)fixSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIFont boldSystemFontOfSize:12], UITextAttributeFont,
                                [UIColor whiteColor], UITextAttributeTextColor,
                                nil];
    [self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
    NSDictionary *highlightedAttributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:UITextAttributeTextColor];
    [self.segmentedControl setTitleTextAttributes:highlightedAttributes forState:UIControlStateHighlighted];

    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    self.segmentedControl.tintColor = [UIColor colorWithRed:49.0 / 256.0 green:148.0 / 256.0 blue:208.0 / 256.0 alpha:1];
}

Ответ 2

Чтобы исправить изображения, назначенные с помощью InterfaceBuilder, используйте этот код:

- (void)fixImagesOfSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    for(int i=0;i<toSegmentedControl.numberOfSegments;i++)
    {
        UIImage* img = [toSegmentedControl imageForSegmentAtIndex:i];
        UIImage* goodImg = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        // clone image with different rendering mode
        [toSegmentedControl setImage:goodImg forSegmentAtIndex:i];
    }
}

Ответ 3

Сегодня я столкнулся с этой проблемой. Приложение, над которым я работаю по обновлению, довольно устарело и по-прежнему использует xib файлы, поэтому я не знаю, работает ли это на раскадках или нет. Как было предложено выше, вам все равно нужно использовать SDK iOS 6.1, но этого недостаточно. После выполнения следующих шагов мне удалось вернуть старый UISegmentedControl внешний вид:

  • Откройте соответствующий документ-конструктор интерфейса
  • Перейдите к инспектору файла (первая вкладка инспектора, есть значок документа)
  • В разделе "Документ конструктора интерфейса" измените "Открывается" на Xcode 4.6

Я действительно считаю, что это ошибка, и я не удивлюсь, если не будет обходного пути для экземпляров UISegmentedControl, созданных в коде. Я предполагаю, что это несколько связано с устаревшим свойством segmentedControlStyle в iOS 7 (см. https://developer.apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/UISegmentedControl/segmentedControlStyle).

Надеюсь, что это поможет кому-то там.

Ответ 4

Если вы сохраните файл iPhoneOS6.1.sdk из предыдущей версии XCode и добавите его в Xcode 5 по тому же пути, вы можете затем создать приложение против 6.1 SDK, чтобы при запуске 7 все было как 6. Связывание с iOS7 SDK говорит iOS, чтобы все выглядело как iOS7, если это возможно. По существу, у вас есть приложение iOS6, но его создание с помощью XCode 5.

Ответ 5

Если вы используете изображения в любом из сегментов UISegmentedControl, вам нужно будет добавить код для правильного их установки на iOS 7, иначе они будут использоваться в качестве изображения шаблона, а выбранный сегмент будет вырезать сегмент фона.

UISegmentedControl под iOS 7 интерпретирует его изображения как находящиеся в режиме рендеринга UIImageRenderingModeAlwaysTemplate, если не указано иное. Я должен был использовать - [UIImage imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] для каждого изображения сегмента для iOS 7 для достижения предыдущего поведения.

Ответ 6

Либо вы могли:

  • Не обновляйте приложение для iOS7, пока не будете готовы внести некоторые изменения в пользовательский интерфейс. Приложения, составленные против SDK iOS6, будут работать в режиме совместимости iOS6 на iOS7 и будут выглядеть точно так же, как в iOS6.
  • Примените пользовательские изображения фона, разделителя и т.д. к вашим сегментированным элементам управления, которые имитируют внешний вид, который у них был в iOS6.

Ответ 7

Возможно ли это? Не совсем...

Вы можете создать собственный сегментированный элемент управления.

Или вы могли бы использовать прокси-сервер UIAppearance, чтобы настроить сегментированный элемент управления с изображениями, но затем ваша ответственность за то, чтобы он выглядел так, как будто это было на iOS 6.

Ответ 8

Да, возможно, если вы воссоздаете элемент управления самостоятельно. Создайте поддельный сегментированный элемент управления, который выглядит и работает как один.

Ответ 9

В моем приложении я настроил элемент Segmented на "Bar". Он отображается в стиле ios6 на моем ios7 iphone5 (whoa, 5,6,7). Тем не менее, текст внутри сегментов обрезается и имеет три точки "...", независимо от того, насколько широка точка зрения. Таким образом, рендеринг с сегментированным управлением ios6 в ios7 кажется действительно ошибочным