programing

UI SegmentedControl 선택한 세그먼트 색상

skycolor 2023. 10. 14. 10:00
반응형

UI SegmentedControl 선택한 세그먼트 색상

에서 정의할 수 있는 ?UISegmentedControl?

발견했습니다.segmentedController.tintColor속성을 선택하면 세그먼트된 컨트롤 전체의 색상을 사용자 정의할 수 있습니다.에 밝은 tintColor속성, 선택한 세그먼트는 거의 인식할 수 없게 됩니다(해당 색상은 나머지 세그먼트 컨트롤과 거의 동일하므로 선택한 세그먼트와 선택하지 않은 세그먼트를 구분하기가 어렵습니다).그래서 저는 어떤 좋은 밝은 색도 분절된 제어에 사용할 수 없습니다.솔루션은 선택한 세그먼트 색상에 대한 별도의 속성이지만 찾을 수 없습니다.이거 누가 해결했어요?

선택한 세그먼트를 RGB 색상으로 변경하는 가장 간단한 방법은 다음과 같습니다.서브클래싱이나 해킹은 필요 없습니다.

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

UIColor *newTintColor = [UIColor colorWithRed: 251/255.0 green:175/255.0 blue:93/255.0 alpha:1.0];
    segmentedControl.tintColor = newTintColor;

UIColor *newSelectedTintColor = [UIColor colorWithRed: 0/255.0 green:175/255.0 blue:0/255.0 alpha:1.0];
[[[segmentedControl subviews] objectAtIndex:0] setTintColor:newSelectedTintColor];

다음 예제에서는 중요한 단계를 보여 줍니다.

  1. 컨트롤 스타일을 작동하는 데 필요한 "StyleBar"로 설정합니다.
  2. 전체 컨트롤에 대해 먼저 선택하지 않은 색상을 주황색으로 설정합니다.
  3. 선택한 세그먼트의 색상을 녹색으로 설정합니다.

주의:

  • 1단계와 2단계는 인터페이스 빌더 또는 그림과 같이 코드로 수행할 수 있습니다.그러나 3단계는 코드로만 가능합니다.
  • 이와 같이 "123.0/255.0"과 같은 표기로 컬러 값을 설정하는 것은 UIColor에서 요구하는 정규화된 Float 값 대신 RGB 값을 돋보이게 하는 방법일 뿐입니다(원한다면 무시하십시오).

UI Segment Control에서 선택한 세그먼트에 대해 색상을 추가하는 간단한 방법을 찾았습니다.

보낸 사람은 UI SegmentControl입니다.

for (int i=0; i<[sender.subviews count]; i++) 
{
    if ([[sender.subviews objectAtIndex:i]isSelected] ) 
    {               
    UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0];
    [[sender.subviews objectAtIndex:i] setTintColor:tintcolor];
    }
   else 
    {
        [[sender.subviews objectAtIndex:i] setTintColor:nil];
    }
}

나에게 효과가 있는지 확인하기

컨트롤의하고 등 선택한 만 하면 . 예를 들어, 세그먼트된 컨트롤의 하위 보기를 반복하고 테스트합니다.isSelected부동산, 그 다음에 전화하기만 하면 됩니다.setTintColor:그 서브뷰의 메소드입니다.

Interface Builder의 ValueChanged 이벤트에 대한 각 세그먼트 컨트롤에 작업을 연결하여 이 작업을 수행했습니다. 뷰 컨트롤러 파일에 있는 이 메서드에 연결했습니다. 이 메서드는 본질적으로 msprague의 답변입니다.

- (IBAction)segmentedControlValueChanged:(UISegmentedControl*)sender
{
    for (int i=0; i<[sender.subviews count]; i++)
    {
        if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[sender.subviews objectAtIndex:i]isSelected])
        {
            [[sender.subviews objectAtIndex:i] setTintColor:[UIColor whiteColor]];
        }
        if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[sender.subviews objectAtIndex:i] isSelected])
        {
            [[sender.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
        }
    }
}

를 열 .-(void)viewDidAppear:animated메소드를 호출하고 메소드를 다음과 같이 호출합니다.

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    //Ensure the segmented controls are properly highlighted
    [self segmentedControlValueChanged:segmentedControlOne];
    [self segmentedControlValueChanged:segmentedControlTwo];
}

일부 보너스 포인트의 경우 선택 시 흰색 틴트 색상을 사용하도록 세그먼트 컨트롤을 설정하고 텍스트를 선택할 때 텍스트의 색상을 검은색으로 변경하려면 다음과 같이 수행할 수 있습니다.

//Create a dictionary to hold the new text attributes
NSMutableDictionary * textAttributes = [[NSMutableDictionary alloc] init];
//Add an entry to set the text to black
[textAttributes setObject:[UIColor blackColor] forKey:UITextAttributeTextColor];
//Set the attributes on the desired control but only for the selected state
[segmentedControlOne setTitleTextAttributes:textAttributes forState:UIControlStateSelected];

iOS 6의 도입으로 처음으로 선택한 항목의 틴트 색상을 설정할 수 있게 되었습니다. DidAppear 방법은 작동하지 않을 것입니다. 이를 해결하기 위해 그랜드 센트럴 디스패치를 사용하여 짧은 시간 후에 선택한 색상을 변경했습니다.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.05 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [self segmentedControlValueChanged:segmentedControlOne];
    });

어떤 이유에서인지 Apple은 표준 UIS 세그먼트 컨트롤의 색상을 변경할 수 없습니다.

그러나 세그먼트된 컨트롤 스타일을 UI SegmentedControlStyleBar로 변경하는 "법적" 방법이 있습니다.이것은 당신이 좋아하지 않을 수도 있지만 색상은 허락하지 않는 약간 다르게 보이게 해줍니다.

    NSArray *itemArray = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];

//바 스타일 및 광고를 변경하여 보기 후 세그먼트화된 컨트롤러 해제

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.tintColor = [UIColor colorWithRed:.9 green:.1 blue:.1 alpha:1]; 
[self.view addSubview:segmentedControl];
[segmentedControl release];

이게 도움이 됐길 바라면서,

셉 케이드 "도와주러 왔어요"

편집: 이 솔루션은 iOS 6에서는 작동하지 않습니다. 아래 David Thompson의 답변을 참조하십시오.

이 실밥은 정말 오래된 것이지만, 간단한 답들은 하나도 제게 제대로 들어맞지는 않았습니다.

선택 취소된 세그먼트 컨트롤의 색상을 되돌리는 한 승인된 답변이 작동합니다.이와 같은 기능이 당신의 가치 변경 기능에서 작동할 것입니다.

for (int i=0; i<[control.subviews count]; i++) 
{
    if ([[control.subviews objectAtIndex:i]isSelected] ) 
    {               
        UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0];
        [[control.subviews objectAtIndex:i] setTintColor:tintcolor];
    } else {
        UIColor *tintcolor=[UIColor grayColor]; // default color
        [[control.subviews objectAtIndex:i] setTintColor:tintcolor];
    }
}

이것은 오래된 질문이라는 것을 알고 있습니다. 하지만 이제 xcode 11 +에서 선택된 세그먼트 틴트 색상을 설정할 수 있습니다.

우리가 사용할 수 있는 코드selectedSegmentTintColor 한 iOS 13+

다음은 uihacker의 Custom SegmentedControl의 수정된 버전입니다(댓글의 크레딧 참조).아이디어는 선택한 것을 사용하여 틴트 컬러를 변경해야 하는 하위 보기를 찾는 방법을 변경하는 것입니다.Index to is Selected 메서드입니다.서브뷰 순서가 무작위로 변경되는 3개 이상의 세그먼트(심지어 uihacker의 "SetSelected")가 있는 사용자 정의 UI Segmented Control을 사용하고 있었기 때문입니다.IndexOnce" 플래그가 이 문제를 해결하지 못합니다!).코드는 아직 개발 초기 단계이므로 본인의 책임하에 사용합니다.어떤 의견이든 환영합니다 :)

또한 인터페이스 빌더에 지원을 추가하고 setSelectedSegment를 재정의했습니다.색인을 만들어 색도 업데이트합니다.맛있게 드세요.

Custom SegmentedControl.h

//
//  CustomSegmentedControl.h
//
//  Created by Hlung on 11/22/54 BE.
//  Copyright (c) 2554 __MyCompanyName__. All rights reserved.
//
//  Credit: http://uihacker.blogspot.com/2010/05/iphone-uisegmentedcontrol-custom-colors.html

@interface CustomSegmentedControl : UISegmentedControl {
    UIColor *offColor,*onColor;
}
@property (nonatomic,retain) UIColor *offColor,*onColor;
-(id)initWithItems:(NSArray *)items offColor:(UIColor*)offcolor onColor:(UIColor*)oncolor;
@end

Custom Segmented Control.m

#import "CustomSegmentedControl.h"

@interface CustomSegmentedControl (private)
-(void)setInitialMode;
-(void)toggleHighlightColors;
@end

@implementation CustomSegmentedControl

@synthesize offColor,onColor;

-(id)initWithItems:(NSArray *)items offColor:(UIColor*)offcolor onColor:(UIColor*)oncolor {
    if (self = [super initWithItems:items]) {
        // Initialization code
        self.offColor = offcolor;
        self.onColor = oncolor;
        [self setInitialMode];

        // default to 0, other values cause arbitrary highlighting bug
        [self setSelectedSegmentIndex:0];
    }
    return self;
}
- (void)awakeFromNib {
    // default colors
    self.offColor = [UIColor colorWithWhite:0.8 alpha:1];
    self.onColor = self.tintColor;
    [self setInitialMode];

    [self setSelectedSegmentIndex:0];
}

-(void)setInitialMode
{
    // set essential properties
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSegmentedControlStyle:UISegmentedControlStyleBar];

    // loop through children and set initial tint
    for( int i = 0; i < [self.subviews count]; i++ )
    {
        [[self.subviews objectAtIndex:i] setTintColor:nil];
        [[self.subviews objectAtIndex:i] setTintColor:offColor];
    }

    // listen for updates, [self setSelectedSegmentIndex:0] triggers UIControlEventValueChanged in 5.0, 4.3 doesn't (facepalm), use  if( self.window ) to fix this
    [self addTarget:self action:@selector(toggleHighlightColors) forControlEvents:UIControlEventValueChanged];
}

// ---------------
// hlung's version
// ---------------
-(void)toggleHighlightColors
{
    // the subviews array order randomly changes all the time, change to check for "isSelected" instead
    for (id v in self.subviews) {
        if ([v isSelected]) [v setTintColor:onColor];
        else [v setTintColor:offColor];
    }
}
// override: update color when set selection
- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex {
    [super setSelectedSegmentIndex:selectedSegmentIndex];
    [self toggleHighlightColors];
}
// ---------------
@end

사용 방법:

[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor colorWithRed:255.0/255 green:37.0/255 blue:99.0/255 alpha:1.0]} forState:UIControlStateSelected];

이것이 앱스토어에서 승인될지는 확실하지 않지만 UIS Segmented Control에 사용자 지정 선택 및 선택 취소 색상을 설정할 수 있는 하위 클래스를 작성했습니다.자세한 내용은 참고 사항을 확인하십시오.

http://uihacker.blogspot.com/2010/05/iphone-uisegmentedcontrol-custom-colors.html

@jothikenpachi가 위에서 제공한 답변을 명확히 설명하기 위해 다음 UI Segment Controller 범주가 iOS6에서 잘 작동하고 세그먼트에서 임의의 On/Off 색상 체계를 허용한다는 것을 발견했습니다.또한 향후 OS 릴리스에서 개인 메서드가 Selected/setTintColor:로 변경되면 정상적으로 실패합니다.프라이빗 API 호출 등을 주의해야 합니다.

@implementation UISegmentedControl(CustomTintExtension) {
-(void) updateCustomTintColorOn:(UIColor*)onColor Off:(UIColor*)offColor {
// Convenience function to rest the tint colors after selection, called upon change of selected index

SEL tint = @selector(setTintColor:);

for (UIView *view in [self subviews]) {
    // Loop through the views...
    if (view && ([view respondsToSelector:tint])) {
        [view performSelector:tint withObject:nil];
    }
    if (view && ([view respondsToSelector:tint])) {
        [view performSelector:tint withObject:offColor];
    }
}

// Checking if segment subview is selected...
SEL isSelected = @selector(isSelected);
for (UIView *view in [self subviews]) {
    if ([view respondsToSelector:isSelected] && [view performSelector:isSelected withObject:nil])
    {
        [view performSelector:tint withObject:onColor];
        break;
    }
}

}

참고로, 이 범주 방법은 UI Segment Controller 내에서 호출됩니다.- (IBAction) segmentAction: (id)sender방법.

또한 iOS6의 경우 처음에는 이 방법을 UIViewController의 관리 버전에서 호출해야 할 수도 있습니다.- (void)viewDidAppear:(BOOL)animated애니메이션 플래시가 발생할 수 있습니다.이를 최소화하려면 IB에서 "offColor"를 UIS 세그먼트 컨트롤러의 틴트 컬러로 설정해 보십시오.

iOS6와는 다른 iOS7에서 이 문제를 발견했습니다.

iOS 7에서 선택한 세그먼트의 라벨 색상은 UI Segment Control 배경과 동일한 색상입니다.iOS 7에서 변경할 수 있는 유일한 방법은 UI Segment Control의 배경색을 설정하는 것입니다.

segmentControl.backgroundColor = customColor;

이걸 사용했는데 한 번에 색깔이 다 바꼈어요.

mySegmentedControl.tintColor = [UIColor redColor]

세그먼트와 동일한 인덱스로 하위 보기에 태그를 사용하여 세그먼트를 순서에 상관없이 올바르게 색칠할 수 있습니다.

// In viewWillAppear set up the segmented control 

// then for 3 segments:  
self.navigationItem.titleView = segmentedControl;
//Order of subviews can change randomly!, so Tag them with same index as segment
[[[segmentedControl subviews]objectAtIndex:0]setTag:0]; 
[[[segmentedControl subviews]objectAtIndex:1]setTag:1];
[[[segmentedControl subviews]objectAtIndex:2]setTag:2];


// color follows the selected segment
- (IBAction)mySelector:(id)sender {
selector = [sender selectedSegmentIndex]
  for (id seg in [segmentedControl subviews]) {
    for (id label in [seg subviews]) {
        if ([seg tag] == selector){
            [seg setTintColor:selectedColor];
        } else {
            [seg setTintColor:nonSelectedColor];
        }
    }
  }
}

// in viewDidAppear for returning to the view
[segmentedControl setSelectedSegmentIndex:selector];
for (id seg in [segmentedControl subviews]) {
    for (id label in [seg subviews]) {
        if ([seg tag] == selector){
            [seg setTintColor:selectedColor];
        } else {
            [seg setTintColor:nonSelectedColor];
        }
    }
}

세그먼트 간에 전환할 때는 상위 두 가지 솔루션이 제게 적합하지 않았습니다.

제 솔루션은 뷰 컨트롤러에서 세그먼트 변경 이벤트를 처리한 다음 세그먼트가 변경될 때마다 이 메서드를 호출하는 것이었습니다.

+ (void)setSegmentedControl:(UISegmentedControl *)segmentedControl 
              selectedColor:(UIColor *)selectedColor 
            deselectedColor:(UIColor *)deselectedColor
{
    for (int i = 0; i < segmentedControl.subviews.count; i++) 
    {
        id subView = [segmentedControl.subviews objectAtIndex:i];

        if ([subView isSelected])
            [subView setTintColor:selectedColor];
        else
            [subView setTintColor:deselectedColor];
    }    
}

왜 아무도 그 일에 대해 언급하지 않았는지 궁금합니다.UIAppearanceProxy

Apple 문서::

https://developer.apple.com/documentation/uikit/uisegmentedcontrol#1653545

샘플 코드:

    private class func applyUISegmentControlAppearance(){
    let apperance = UISegmentedControl.appearance()

    // Set Navigation bar Title colour
    let unselAttrib = [NSForegroundColorAttributeName:UIColor.yellow,
                                        NSFontAttributeName: UIFont.systemFont(ofSize: 15)]

    let selAttrib = [NSForegroundColorAttributeName:UIColor.red,
                     NSFontAttributeName: UIFont.boldSystemFont(ofSize: 15)]


    apperance.setTitleTextAttributes(unselAttrib, for: .normal)
    apperance.setTitleTextAttributes(selAttrib, for: .selected)
}

콜 프롬: 이 메서드를 호출할 수 있습니다.AppDelegate부터

application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool

당신과 같은 일을 하려면, 누군가는 문서화되지 않은 기능과 해킹에 접근해야 할 수도 있고, 이는 분명히 사과를 격노하게 만들 것이고, 그것은 당신의 신청이 거절될 수도 있습니다.

이제 해결책은 두 개의 버튼을 대신 사용하고 버튼을 클릭하면 이미지가 서로 바뀌게 하는 다른 방법에 있습니다.버튼과 반분절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절절

도움이 되길 바랍니다.

감사해요.

매습

각 세그먼트에 태그를 지정한 다음 태그에 대해 TintColor를 설정할 수 있습니다.

#define kTagOffState 0
#define kTagOnState  2

#define UIColorFromRGB(rgbValue) [UIColor \
        colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
        green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \
        blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

//usage     UIColor color = UIColorFromRGB(0xF7F7F7);

 UIColor onColor = UIColorFromRGB(0xF7F7F7);
 UIColor offColor = UIColorFromRGB(0x878787);

        [multiStateControl setTag:kTagOffState forSegmentAtIndex:0];
        [multiStateControl setTag:kTagOnState forSegmentAtIndex:1];
        [multiStateControl setTintColor:onColor forTag:kTagOnState];
        [multiStateControl setTintColor:offColor forTag:kTagOffState];  

저는 위의 답변들이 매우 도움이 된다는 것을 알았습니다.나는 분절된 컨트롤을 사용하여 노브의 정밀도를 설정하고 있습니다.위의 답변들을 종합해서 생각해 냈습니다.

-(void) viewDidLoad {

NSArray *segments = [NSArray arrayWithObjects:@"Course", @"Fine",nil];

[knob setPrecision:0.1]; // initial precision
// Set starting values

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:segments];

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.frame = CGRectMake(120, 680, 228, 30);
[segmentedControl addTarget:self action:@selector(precisionSelect:) forControlEvents:UIControlEventValueChanged];
segmentedControl.momentary = YES;

[self.view addSubview:segmentedControl];
}   

- (void)precisionSelect:(UISegmentedControl*)sender
{   
    UIColor *tintcolor = [UIColor darkGrayColor];   
    if (sender.selectedSegmentIndex == 0) {
        [[sender.subviews objectAtIndex:0] setTintColor:nil];
        [[sender.subviews objectAtIndex:1] setTintColor:tintcolor];
    [knob setPrecision:0.1]; // Coarse
    } else {
        [[sender.subviews objectAtIndex:0] setTintColor:tintcolor];
        [[sender.subviews objectAtIndex:1] setTintColor:nil];
    [knob setPrecision:0.05]; // Fine
    }

}

이것이 다른 사람들에게 도움이 되길 바랍니다.저에게 중요한 것은 다음을 사용하여 선택되지 않은 인덱스를 재설정할 수 있다는 것이었습니다.setTintColor:nil];

- (IBAction)segmentControlValueChanged:(UISegmentedControl *)sender
{
    if ([[sender.subviews firstObject] respondsToSelector:@selector(setTintColor:)]) {
        for (id segment in sender.subviews) {
            if ([segment respondsToSelector:@selector(isSelected)] && [segment isSelected]) {
                [segment setTintColor:[UIColor redColor]];
            } else {
                [segment setTintColor:[UIColor grayColor]];
            }
        }
    }
}
Try this solution.    

enter image description here

enter image description here

        @IBAction func dashBoardSegmentValueChanged(sender: AnyObject) {
            switch dashBoardSegment.selectedSegmentIndex
            {
            case 0:     
                sender.subviews.last?.backgroundColor = UIColor.whiteColor()
                sender.subviews.first?.backgroundColor =  UIColor.clearColor()

                break;
            case 1:            
                sender.subviews.first?.backgroundColor =  UIColor.whiteColor()
                sender.subviews.last?.backgroundColor = UIColor.clearColor()
                break;
            default:
                break;
            }
        }

Note: Make sure you select one segment subview as initial selected for easiness. It works if you have two segment subviews.
- (IBAction)segmentedControlValueChanged:(UISegmentedControl *)sender {
    for (int i = 0; i < sender.subviews.count; i++) {
        UIControl *component = [sender.subviews objectAtIndex:i];
        if ([component respondsToSelector:@selector(isSelected)]) {
            UIColor *selectedColor = [UIColor greenColor];
            UIColor *normalColor   = [UIColor blackColor];
            UIColor *tint = component.isSelected ? selectedColor : normalColor;
            [component setTintColor:tint];
        }
    }
}
[segmentedControl setSelectedSegmentTintColor:[UIColor darkGrayColor]];

//For iOS 13

이 스위프트 4 코드는 저에게 적합합니다.

segmentedControl.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.red], for: .selected)

언급URL : https://stackoverflow.com/questions/2270526/uisegmentedcontrol-selected-segment-color

반응형