【问题标题】:very strange issue with UISegmentedControlUISegmentedControl 的非常奇怪的问题
【发布时间】:2012-05-25 22:30:20
【问题描述】:

代码如下:

UISegmentedControl * segmentedCtrl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(0, 0, 180, 35)];
    //[segmentedCtrl setTintColor:[UIColor brownColor]];
    [segmentedCtrl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [segmentedCtrl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
    [segmentedCtrl setBackgroundColor:[UIColor clearColor]];

    [segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:0 animated:NO];
    [segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:1 animated:NO];
    [segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:2 animated:NO];

    [segmentedCtrl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
    [segmentedCtrl setSegmentedControlStyle:UISegmentedControlStyleBar];
    //[segmentedCtrl setMomentary:YES];
    [segmentedCtrl.layer setBorderWidth:1.0];
    [segmentedCtrl.layer setCornerRadius:5.0];

但是,当我按下分段控件时,我得到了这个:

有去除蓝色高光的想法吗?

这是我压缩的一个示例项目,它显示了这个问题:

http://dl.dropbox.com/u/19680269/Test.zip

【问题讨论】:

  • 你试过用其他图片知道是不是图片吗?然后,您可以尝试删除 UISegmentedControl 子视图的子视图。
  • 您是否尝试将 tintColor 设置为 [UIColor clearColor];
  • 是的,我有..我已经附加了项目..现在很简单,只是一个带有 UISegmentedButton 的 UIViewController
  • 这行代码让我崩溃:[segmentedControl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  • 哦,好的,它只在 4.3 模拟器上崩溃,iOS 5 没问题

标签: iphone objective-c ios ipad


【解决方案1】:

我试过你的代码...

我通过添加此代码解决了问题

[segmentedCtrl setSegmentedControlStyle:UISegmentedControlStyleBezeled];

所以整个代码会是这样的

UISegmentedControl * segmentedCtrl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(0, 0, 180, 35)];
//[segmentedCtrl setTintColor:[UIColor brownColor]];
[segmentedCtrl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[segmentedCtrl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[segmentedCtrl setBackgroundColor:[UIColor clearColor]];
[segmentedCtrl setSegmentedControlStyle:UISegmentedControlStyleBezeled];
[segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:0 animated:NO];
[segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:1 animated:NO];
[segmentedCtrl insertSegmentWithImage:[UIImage imageNamed:nil] atIndex:2 animated:NO];

[segmentedCtrl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
//[segmentedCtrl setMomentary:YES];
[segmentedCtrl.layer setBorderWidth:1.0];
[segmentedCtrl.layer setCornerRadius:5.0];

【讨论】:

  • 以前是默认样式
  • 所以你有两次 setSegmentedControlStyle
  • 您是否真的尝试点击该段并查看是否出现蓝色。蓝色突出显示仅在您单击它时出现。在我的情况下,它仍然显示在您的代码上方
  • 你有一个,两个,三个..但是在你的代码中你设置了一个零图像的片段,这是矛盾的
【解决方案2】:

您可以添加分隔符 png 文件:

[segmentedControl setDividerImage:[UIImage imageNamed:@"separator.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

ps:

你为什么将它两次添加到你的视图中?

[self.view addSubview:segmentedControl];

编辑:

如果您真的不需要分段之间的分隔符,您可以这样删除它们:

for (UIView* aSubV in segmentedControl.subviews) {
    NSLog(@"•••");
    NSLog(@"aSubV2: %@",[aSubV.subviews objectAtIndex:1]);
    UIView* separatorToRemove = [aSubV.subviews objectAtIndex:1];
    [separatorToRemove removeFromSuperview];
}

【讨论】:

    【解决方案3】:
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    

    viewDidLoadMCSegmentedControlDemoViewController.m 中添加此行修复了该错误。 蓝色是普通段视图的突出显示颜色。

    当您为普通段设置背景时,它不会完全覆盖。所以你会看到边缘的蓝色。

    将其设置为条形样式可使您的图像覆盖整个片段。因此你不会看到蓝色。

    【讨论】:

      【解决方案4】:

      我不确定这是否正是您要查找的内容,但如果您使用下面的代码,结果将是:

      对代码的更改:

      • 您将 segmentedControl 添加到 self.view 两次 - 删除了第一次出现
      • 已添加[segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar];

      段之间有一条 1px 的绿线 - 这是由于您的线:

      segmentedControl.tintColor = [UIColor colorWithRed:.0 green:.6 blue:.0 alpha:1.0];
      

      如果您希望线条具有其他颜色,只需更改 tintColor 属性即可。

      完整的viewDidLoad 看起来像:

      代码未在其他任何地方修改。

      - (void)viewDidLoad
      {
          [super viewDidLoad];
          self.view.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
          NSArray *items = [NSArray arrayWithObjects:
                            @"one",
                            @"two",
                            [UIImage imageNamed:@"star.png"],
                            nil];
      
          UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items];
      
          // set frame, add to view, set target and action for value change as usual
          segmentedControl.frame = CGRectMake(10.0f, 208.0f, 300.0f, 44.0f);
          //[self.view addSubview:segmentedControl];
          [segmentedControl addTarget:self action:@selector(segmentedControlDidChange:) forControlEvents:UIControlEventValueChanged];
      
          [segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar];
      
          [segmentedControl setBackgroundImage:[UIImage imageNamed:@"btn-gradient-brown"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
          segmentedControl.selectedSegmentIndex = 1;
      
          // Set a tint color
          segmentedControl.tintColor = [UIColor colorWithRed:.0 green:.6 blue:.0 alpha:1.0];
      
          [self.view addSubview:segmentedControl];
          [segmentedControl release];    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-26
        • 2013-02-07
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多