2011-11-04 2 views
5

UISegmentedControl의 색상을 쉽게 변경할 수 있습니다. this, this site 및 가장 좋은 this solution과 같은 다양한 솔루션을 발견했습니다. 그러나 내가 원하는 것은 아무 것도 없었다.사용자 정의 색상의 UISegmentedControl : 구분선 버그

나는 간단한 일을 만드는 시도하고이 내 코드이고, 아주 쉬운 일 : (필자는 아이폰 OS 4.2을 사용하고 아닌 5.0 엑스 코드 4.0.2)

id segment[3]; 
UISegmentedControl *segmentedControl; 
- (id)init 
{ 
    NSArray *itens = [NSArray arrayWithObjects: @"Option 1", @"Option 2", @"Option 3", nil];  
    segmentedControl = [[UISegmentedControl alloc] initWithItems:itens]; 
    [segmentedControl setFrame:CGRectMake(0, 0, 500, 30)]; 
    [segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar]; 
    [segmentedControl addTarget:self 
        action:@selector(segmentedControl:) 
      forControlEvents:UIControlEventAllEvents]; 

    switch (type) { 
     case type1: [segmentedControl setSelectedSegmentIndex:0]; break; 
     case type2: [segmentedControl setSelectedSegmentIndex:1]; break;   
     case type3: [segmentedControl setSelectedSegmentIndex:2]; break;   
    } 
    for (int i=0; i<3; i++) { 
     //The most important trick to work, have to retain the subviews 
     segment[i] = [[[segmentedControl subviews] objectAtIndex:i] retain]; 
    } 
    [self changeColor]; 
    [self addSubview:segmentedControl]; 
    return self; 
} 

- (void)segmentedControl:(id)sender 
{ 
    //do some thing 
    [self changeColor]; 
} 

- (void)changeColor{ 
    for (int i=0; i<3; i++) { 
     [segment[i] setTintColor:[UIColor lightGrayColor]]; 
    } 
    int select = segmentedControl.selectedSegmentIndex; 
    [segment[select] setTintColor:[UIColor blueColor]];  
} 

를 그래서이를 만듭니다 아주 좋은

first image

, 그때 클릭 Option 2

second

012 3,516,

와우,이 때문에 지금 Option 3

problem

에서 문제를 클릭, 내가 원하는 exacly이며, Option 1Option 2 사이 (빨간색 사각형으로 표시)이 바보 파란색 선. 내가 다시 Option 1에 클릭하면, 내가해야합니다 : 블루 라인보다

boring

다시 나타납니다. 즉, 오래된 클릭 세그먼트의 왼쪽면 (첫 번째 세그먼트가 아닌)은이 파란색 선을 갖게됩니다. 만약 내가 오른쪽에서 왼쪽으로 가면 그것은 일어나지 않습니다.

나는 이것을 어떻게 해결해야할지 모르겠다. 이 라인에 액세스하고 색상을 변경하려면 어떻게합니까? 아니면 다른 코드를 사용해야 할 것입니다. 어쩌면 그들은 같은 문제를 갖게 될 것입니다 ...

+0

나는 당신과 같은 문제가 있었고 문제를 찾기 위해 며칠을 보냈습니다. 내 인생을 구한 많은 친구 고마워. !!!! – chatur

답변

3

와우 ... 우리가 쓰는 순간 stackoverflow에 있었고, 우리는 진정하고 더 잘 생각할 수 있습니다. 내 아우 질문에 답을 쓰기 :

If I go from right to left it not happens.

이는 솔루션입니다! 내가 뭘해야되는거야? 이걸 시뮬레이션 해봐.

BOOL inside = FALSE; 
- (void)changeColor{ 
    int old = segmentedControl.selectedSegmentIndex; 
    for (int i=0; i<3; i++) { 
     [segment[i] setTintColor:[UIColor lightGrayColor]]; 
    } 
/**/inside = TRUE; 
/**/for (int i=3; i>0; i--) { 
/**/  //When I do this, it call "segmentedControl:" 
/**/ [segmentedControl setSelectedSegmentIndex:i]; 
/**/} 

/**/int select = old; 
    [segment[select] setTintColor:[UIColor blueColor]];  
    [segmentedControl setSelectedSegmentIndex:select];  
/**/inside = FALSE;  
} 

- (void)segmentedControl:(id)sender 
{ 
/**/if (inside==TRUE) return; //Ignore this calls. 
    //do some thing 
    [self changeColor]; 
} 
5

나는 훨씬 쉬운 해결책이 있다고 생각합니다. 그냥 포인터를 청소하십시오.

for (int i=0; i<[self.segmentedControll.subviews count]; i++) 
{ 
    [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:nil]; 
    if (![[self.segmentedControll.subviews objectAtIndex:i]isSelected]) 
    { 
     UIColor *tintcolor=[UIColor blackColor]; 
     [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:tintcolor]; 
    } 
    else 
    { 
     UIColor *tintcolor=[UIColor blueColor]; 
     [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:tintcolor]; 
    } 
} 
+0

또한 세그먼트 컨트롤이로드 될 때 의도 한 색상을 표시하려면 viewDidApear에서 색상을 설정해야합니다. 좋은 & 쉬운 해결책. – mircaea

관련 문제