周りを見回して、縁の色だけを(別のテキストの色で)変更しようとしましたが、うまくいきませんでした。色合いを変更できますが、テキストと境界線の両方が変更されます。
6 に答える
UIAppearance プロキシを使用してタイトル テキスト属性を設定できますが、境界線の tintColor は保持されます。何かのようなもの:
[[UISegmentedControl appearance] setTitleTextAttributes:@{
NSForegroundColorAttributeName : [UIColor redColor]
} forState:UIControlStateNormal];
編集:
画像に色を付けるには、UImage のカテゴリで次のようなものを使用できます。
- (instancetype)tintedImageWithColor:(UIColor *)tintColor {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = (CGRect){ CGPointZero, self.size };
CGContextSetBlendMode(context, kCGBlendModeNormal);
[self drawInRect:rect];
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
UISegmentedControl
そのような画像を変更する必要があるよりも、画像を設定するときは、別のソリューション(カテゴリなし)を好みます:
NSArray *items = nil;
if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
items = @[
[[UIImage imageNamed:@"Images_Icon_Notes.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Keywords.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Actionitems.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Questions.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]
];
} else {
items = @[
[UIImage imageNamed:@"Images_Icon_Notes.png"],
[UIImage imageNamed:@"Images_Icon_Keywords.png"],
[UIImage imageNamed:@"Images_Icon_Actionitems.png"],
[UIImage imageNamed:@"Images_Icon_Questions.png"]
];
}
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items];
segmentedControl.tintColor = [UIColor greenColor]; // desired color of border
tintColor
アイコンではなく境界線のみに影響を与えるようになりました。
if
古い iOS バージョンとの互換性を提供します。
これimageWithRenderingMode:
は、私が今まで見た中で最も優れた API WTF の 1 つだと言わざるを得ません。
私にとってうまくいったのは、他の回答が示唆するように、segmentedControl の tintColor を clearColor に変更することです。そして、画像をアプリの色合いに手動で着色します。
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
色付きの画像でを使用することを忘れないでください
-(UIImage *)tintedImage:(UIImage *)image withColor:(UIColor *)tintColor
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = (CGRect){ CGPointZero, image.size };
CGContextSetBlendMode(context, kCGBlendModeNormal);
[image drawInRect:rect];
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return [newImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
私の解決策では、セグメント化されたコントロールの境界線に別の色を付け、テキストを色合いのままにします。
セグメント化されたコントロールの境界線の色のみを変更するには、別のセグメント化されたコントロールを古いコントロールの上に置きます。次に、この新しいセグメントのユーザー インタラクションを無効にし、選択したセグメントの画像を nil に設定します。
UISegmentedControl *segCtrl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Segm 1", @"Segm 2", @"Segm 3", @"Segm 4", nil]];
// The UISegmentedController which you want to change the border color for
[segCtrl setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[segCtrl setSelectedSegmentIndex:0];
[segCtrl setTintColor:[UIColor redColor]];
UISegmentedControl *bcg = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@" ", @" ", @" ", @" ", nil]];
// The UISegmentedController you put on top of the other one
[bcg setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[bcg setSelectedSegmentIndex:0];
[bcg setImage:nil forSegmentAtIndex:0]; // Removing highlight color
[bcg setTintColor:[UIColor greenColor]];
[bcg setUserInteractionEnabled:NO];
[[self view] addSubview:segCtrl];
[[self view] addSubview:bcg];
もちろん、用途に合わせてフレーミングとカラーリングに注意する必要があります。それ以外は、このコードで問題ありません。
for (int i=0; i<[mySegmentedControl.subviews count]; i++)
{
if ([[mySegmentedControl.subviews objectAtIndex:i]isSelected] )
{
[[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor blueColor]];
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]];
}
else
{
[[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor whiteColor]];
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]];
}
}