2013-09-19 2 views
3

у меня есть сегментированный контроль в моем iPhone приложение, которое отлично работает на iOS6, но на ios7 сегменте плитки отсекаются (имеется достаточно места для текста, но он обрезает их так или иначе)UISegmentedControl укороченные названия сегмента

self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
self.segmentedControl.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
NSDictionary *defaultTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:defaultFont, 
             UITextAttributeFont, 
             defaultFontColor, 
             UITextAttributeTextColor, 
             nil]; 
[self.segmentedControl setTitleTextAttributes:defaultTextAttributes forState:UIControlStateNormal]; 

NSDictionary *selectedTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:selectedFont, 
             UITextAttributeFont, 
             selectedFontColor, 
             UITextAttributeTextColor, 
             nil]; 
[self.segmentedControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateHighlighted]; 

Любые предложения по устранению этого? Почему это работает прямо на iOS6, но усечение названия на ios7 ...

Это код, который вызывает проблему ...

 UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)]; 
    /* Selected background */ 
    UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)]; 
    /* Image between two unselected segments */ 
    UIImage *bothUnselectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)]; 
    /* Image between segment selected on the left and unselected on the right */ 
    UIImage *leftSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)]; 
    /* Image between segment selected on the right and unselected on the right */ 
    UIImage *rightSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)]; 

    if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { 
#ifdef __IPHONE_7_0 
     unselectedBackgroundImage = [unselectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
     selectedBackgroundImage = [selectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
     bothUnselectedImage = [bothUnselectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
     leftSelectedImage = [leftSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
     rightSelectedImage = [rightSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
#endif 
    } 


    [[UISegmentedControl appearance] setBackgroundImage:unselectedBackgroundImage 
               forState:UIControlStateNormal 
              barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setBackgroundImage:selectedBackgroundImage 
               forState:UIControlStateSelected 
              barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setDividerImage:bothUnselectedImage 
           forLeftSegmentState:UIControlStateNormal 
            rightSegmentState:UIControlStateNormal 
              barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setDividerImage:leftSelectedImage 
           forLeftSegmentState:UIControlStateSelected 
            rightSegmentState:UIControlStateNormal 
              barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setDividerImage:rightSelectedImage 
           forLeftSegmentState:UIControlStateNormal 
            rightSegmentState:UIControlStateSelected 
              barMetrics:UIBarMetricsDefault]; 

Если я закомментируйте этикетки показать хорошо .. ., но мне нужно фоновые изображения .... Так как я держу iOS6 совместимости, а также имеющей индивидуальный сегментированный контроль над ios7

+0

То же самое, братан! Только то, что я не использую никаких изображений для вкладок - только заголовки. Самое странное, что при запуске приложения все заголовки выглядят хорошо, но если вы перейдете на главный экран и обратно в приложение, тогда, когда вы нажимаете на сегментированную кнопку управления, заголовок этой кнопки будет усечен. Это приложение для iPad. –

+0

и исправление ... ???? Кто-нибудь? – user426132

+0

Ну, я думаю, я исправил его с настройкой шрифта для заголовков ... Итак, кажется, что у вас разные проблемы. Извините –

ответ

2

Я решил это, установив те же атрибуты текста заголовка, которые у меня были для нормального состояния, для выбранного состояния. В IOS 6 этого было достаточно:

NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            someUIFont, UITextAttributeFont, 
            nil]; 

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal]; 

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

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateSelected]; 
+0

Установка одинаковых атрибутов для состояний Normal и Selected не устраняет эту проблему для меня - я все равно получаю мой текст на этикетке усеченным! – MathewS

+0

Это сработало для меня. И я нахожу, что, поскольку отключенное состояние - это больший размер шрифта, он не будет обрезать метку_. – darkheartfelt

0

Я попытался несколько решений, чтобы избежать пересчитывать все размеры сегмента ,
Чтобы исправить мой вопрос, который я поставил этот код на valueChange действий сегментированного управления:

for(int i=0;i<setControl.subviews.count; i++){ 
    NSString *title=[segControl titleForSegmentAtIndex:i]; 
    [segControl setTitle:title forSegmentAtIndex:i]; 
} 

Проблема происходит с App скомпилированным для iOS6 (с Xcode 4.6.3), который работает на iOS7. Сбой проявляется после возобновления приложения с момента приостановки, но не во всех Views.

1

после некоторого исследования, вот мое решение проблемы (Swift 3, IOS 10)

class CustomSegmentedControl: UISegmentedControl { 

override func draw(_ rect: CGRect) { 

    for segment in subviews { 
     for subview in segment.subviews { 
      if let segmentLabel = subview as? UILabel { 
       segmentLabel.numberOfLines = 0 
       segmentLabel.translatesAutoresizingMaskIntoConstraints = false 
       segmentLabel.leadingAnchor.constraint(equalTo: segment.leadingAnchor).isActive = true 
       segmentLabel.trailingAnchor.constraint(equalTo: segment.trailingAnchor).isActive = true 
       segmentLabel.topAnchor.constraint(equalTo: segment.topAnchor).isActive = true 
       segmentLabel.bottomAnchor.constraint(equalTo: segment.bottomAnchor).isActive = true 
      } 
     } 
    } 
} 

override func didMoveToSuperview() { 
    self.layer.cornerRadius = 5 
    self.clipsToBounds = true 
    self.backgroundColor = .white 
    self.tintColor = UIColor.orange 

    let font = UIFont(name: "Helvetica", size: 12.0) 
    self.setTitleTextAttributes([NSFontAttributeName: font!], for: .normal) 

    let fontBold = UIFont(name: "Helvetica-Bold", size: 12.0) 
    self.setTitleTextAttributes([NSFontAttributeName: fontBold!], for: .selected) 
} 
} 
Смежные вопросы