【问题标题】:UISegmentedControl image highlighting bug in iOS?UISegmentedControl 图像突出显示 iOS 中的错误?
【发布时间】:2017-01-13 06:15:49
【问题描述】:

我有一个应用程序,我想在其中使用 Instagram 中的按钮自定义分段控制。我曾经这样做过

 [[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setSegmentedControlStyle:UISegmentedControlStyleBar];
 [[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor clearColor]];

 [[UISegmentedControl appearance] setBackgroundImage:[UIImage imageNamed:@"back_bg.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 [[UISegmentedControl appearance] setBackgroundImage:[UIImage imageNamed:@"white_btn.png"]

                   forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

 [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segcontrol_uns-sel.png"]
                                     forLeftSegmentState:UIControlStateNormal
                                       rightSegmentState:UIControlStateSelected
                                              barMetrics:UIBarMetricsDefault];
 [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segcontrol_sel-uns.png"]
                                     forLeftSegmentState:UIControlStateSelected
                                       rightSegmentState:UIControlStateNormal
                                              barMetrics:UIBarMetricsDefault];

但是当我选择按钮时,它会突出显示除分割图像之外。所以它看起来是有线的。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: ios iphone ipad uisegmentedcontrol


    【解决方案1】:

    试试这个:

    UIImage *defaultBgImage,*selectedBgImage,*segcontrol_uns,*segcontrol_sel;
    
    if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) 
    {
        defaultBgImage = [[UIImage imageNamed:@"back_bg.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        selectedBgImage = [[UIImage imageNamed:@"white_btn.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        segcontrol_uns = [[UIImage imageNamed:@"segcontrol_uns-sel.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        segcontrol_sel = [[UIImage imageNamed:@"segcontrol_sel-uns.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    }
    else
    {
        defaultBgImage = [UIImage imageNamed:@"back_bg.png"];
        selectedBgImage = [UIImage imageNamed:@"white_btn.png"];
        segcontrol_uns = [UIImage imageNamed:@"segcontrol_uns-sel.png"];
        segcontrol_sel = [UIImage imageNamed:@"segcontrol_sel-uns.png"];
    }
    
    [[UISegmentedControl appearance] setBackgroundImage:defaultBgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    
    [[UISegmentedControl appearance] setBackgroundImage:selectedBgImage
    forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
    
     [[UISegmentedControl appearance] setDividerImage:segcontrol_uns forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected
      barMetrics:UIBarMetricsDefault];
    
     [[UISegmentedControl appearance] setDividerImage:segcontrol_sel forLeftSegmentState: UIControlStateSelected rightSegmentState:UIControlStateNormal
      barMetrics:UIBarMetricsDefault];
    

    【讨论】:

    • 我们还需要将图像用于高亮状态。这实际上是我的意思。无论如何感谢您的尝试。如果您也包括在内,我也会接受答案。
    【解决方案2】:

    您需要为四种不同的状态执行“setBackgroundImage”。

    1. UIControlStateNormal
    2. UIControlStateSelected
    3. UIControlStateHighlighted
    4. UIControlStateSelected | UIControlStateHighlighted(当按下已选择的段时)

    并对七种不同的状态执行“setDividerImage”。

    1. forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected
    2. forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal
    3. forLeftSegmentState:UIControlStateHighlighted rightSegmentState:UIControlStateSelected
    4. forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateHighlighted
    5. forLeftSegmentState:UIControlStateSelected | UIControlStateHighlighted rightSegmentState:UIControlStateNormal
    6. forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected | UIControlStateHighlighted
    7. forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal

    【讨论】:

      【解决方案3】:

      您需要以下三个部分的图像 1.段bg选择 2.段bg未选中 3.segment middle, left selected, right unselected 4. 段中间,左未选中,右选中 5. 中间段,左右都选中 6. 中间段,左右都未选中

      我为 3 段控件编写了这段代码。但是,您可以根据需要对其进行调整。

      /* Unselected background */
      UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"segment_background_unselected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
      [[UISegmentedControl appearance] setBackgroundImage:unselectedBackgroundImage
                                             forState:UIControlStateNormal
                                           barMetrics:UIBarMetricsDefault];
      
      /* Selected background */
      UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"segment_background_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
      [[UISegmentedControl appearance] setBackgroundImage:selectedBackgroundImage
                                             forState:UIControlStateSelected
                                           barMetrics:UIBarMetricsDefault];
      
      /* Image between two unselected segments */
      UIImage *bothUnselectedImage = [[UIImage imageNamed:@"segment_middle_unselected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
      [[UISegmentedControl appearance] setDividerImage:bothUnselectedImage
                               forLeftSegmentState:UIControlStateNormal
                                 rightSegmentState:UIControlStateNormal
                                        barMetrics:UIBarMetricsDefault];
      
      /* Image between segment selected on the left and unselected on the right */
      UIImage *leftSelectedImage = [[UIImage imageNamed:@"segment_middle_left_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
      [[UISegmentedControl appearance] setDividerImage:leftSelectedImage
                               forLeftSegmentState:UIControlStateSelected
                                 rightSegmentState:UIControlStateNormal
                                        barMetrics:UIBarMetricsDefault];
      
      /* Image between segment selected on the right and unselected on the left */
      UIImage *rightSelectedImage = [[UIImage imageNamed:@"segment_middle_right_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
      [[UISegmentedControl appearance] setDividerImage:rightSelectedImage
                               forLeftSegmentState:UIControlStateNormal
                                 rightSegmentState:UIControlStateSelected
                                        barMetrics:UIBarMetricsDefault];
      

      【讨论】:

        【解决方案4】:

        以下代码为我修复了它:

        [[UISegmentedControl appearanceWhenContainedIn:[InboxViewController class], nil]  setBackgroundImage:[UIImage imageNamed:@"btn-gray"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [[UISegmentedControl appearanceWhenContainedIn:[InboxViewController class], nil]  setBackgroundImage:[UIImage imageNamed:@"btn-gray"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
        [[UISegmentedControl appearanceWhenContainedIn:[InboxViewController class], nil]  setBackgroundImage:[UIImage imageNamed:@"btn-gray"] forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
        [[UISegmentedControl appearanceWhenContainedIn:[InboxViewController class], nil]  setBackgroundImage:[UIImage imageNamed:@"btn-gray"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
        

        【讨论】:

          猜你喜欢
          • 2013-01-26
          • 2013-11-16
          • 1970-01-01
          • 2015-11-22
          • 2011-04-09
          • 2011-10-29
          • 1970-01-01
          • 2016-03-19
          • 1970-01-01
          相关资源
          最近更新 更多