【问题标题】:UISegmentedControl setTint for UISegments only works after clickingUISegment 的 UISegmentedControl setTint 仅在单击后有效
【发布时间】:2013-02-06 05:52:21
【问题描述】:

Xcode、Obj-c、iOS 5.2 iOS 6.0

我有一个 UISegmentedControl,它被插入到底部工具栏中,使用如下所示:

-(void) makeSegmentedControl {
    self.SegControl = [[UISegmentedControl alloc] initWithItems:@[@"Title1",@"Title2"]];
    self.SegControl.segmentedControlStyle = UISegmentedControlStyleBar;
    [self.SegControl setTarget:self action:@selector(handleSegment) forControlEvents:UIControlEventValueChanged]
    [self.SegControl setSelectedSegmentIndex:0];
 }
 -(void) AddSegmentedControlToToolbar {
     UIBarButtonItem *tmp = [UIBarButtonItem new];
     [tmp setCustomView:self.SegControl];
     [self.navigationController.toolbar setItems@[tmp]];
 }
 -(void) tintSegmentedControl {
     for (int i = 0; i< [self.SegControl.subviews count]; i++) {
          [[self.SegControl.subviews objectAtIndex:i] setTint:[UIcolor greenColor];
      }
      NSArray * sortedViews = [self.SegControl.subviews sortArrayUsingFunction:sortFunction];
      [[sortedViews objectAtIndex:self.SegControl.selectedSegmentIndex] setTintColor:[UIColor lightGreenColor]];
      for (id view in self.SegControl.subviews) {
          [view removeFromSuperView];
      }
      for (id view in sortedViews) {
          [self.SegControl addSubview:view];
      }
 }
 -(void)viewDidLoad {
     [self makeSegmentedControl];
     [self addSegmentedControlToToobar];
     [self tintSegmentedControl];
  } 
  -(void) handleSegment {
      [self tintSegmentedControl];
  }

当我在我们的应用程序中运行类似的代码时,它会显示一个非常蓝色的 UISegmentedController,它会在单击时变为绿色。我已经尝试了一些事情,似乎 UISegments 上的色调只是拒绝坚持到视图完成加载之后。知道这里发生了什么吗?

编辑

所以,事实证明我实际上使用的是 iOS 6.0 模拟器,并且 iOS 6 中有一个限制,即您不能在 ViewDidAppear:Animated: 运行之前为 UISegmentedController 着色。我认为这是问题所在,因为当我进行此更改时:

-(void)viewDidLoad {
     [self makeSegmentedControl];
     [self addSegmentedControlToToobar];
} 
-(void)viewDidAppear {
     [NSTimer timerWithTimeInterval:0 target:self selector:@selector(tintSegmentedControl) userInfo:nil repeats:NO];
}

它有效。不是 100% 确定发生了什么。有没有更简单的方法?

【问题讨论】:

    标签: xcode ios6 uisegmentedcontrol uicolor tint


    【解决方案1】:

    试试这个代码

    -(void) tintSegmentedControl {
        [self.SegControl setTintColor:[UIColor greenColor];
          NSArray * sortedViews = [self.SegControl.subviews sortArrayUsingFunction:sortFunction];
          [[sortedViews objectAtIndex:self.SegControl.selectedSegmentIndex] setTintColor:[UIColor lightGreenColor]];
          for (id view in self.SegControl.subviews) {
              [view removeFromSuperView];
          }
          for (id view in sortedViews) {
              [self.SegControl addSubview:view];
          }
     }
    

    【讨论】:

    • 其实已经试过了。 SegControl 的 setTintColor 有效,但所选段仍未突出显示。
    【解决方案2】:

    因此,iOS 6 中存在一个限制,即您不能在 ViewDidAppear:Animated: 运行之前为 UISegmentedController 着色。为了规避它,我做了这个代码更改(正如您在编辑中看到的那样)。

    -(void)viewDidLoad {
         [self makeSegmentedControl];
         [self addSegmentedControlToToobar];
    } 
    -(void)viewDidAppear {
         [NSTimer timerWithTimeInterval:0 target:self selector:@selector(tintSegmentedControl) userInfo:nil repeats:NO];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多