从UISegmentedControl
答
我发现的唯一方法是在每个细分区上绘制一层。 坏消息是,那么你必须自己着色选定的部分每次它改变(和“decolonizee”未选中) 好消息是,你可以有许多不同的颜色为每个单独的一组,并显示一个红色附近的绿色附近的蓝...
,你可以打电话给你的方法时的segmentedControl变化:
- (IBAction)changeSection:(id)sender {
UISegmentedControl *segmetedControl = sender;
[self colorize2SegmentsWithSelected:segmetedControl.selectedSegmentIndex];
// (...)
}
,并在你的方法:
-(void)colorize2SegmentsWithSelected:(int)selected{
switch (selected) {
case 0:
[self myShineGradient:[initialStateArraySegmentedControl objectAtIndex:1] withColor1:myUIColor1 withColor2:myUIColor2];
[self myShineGradient:[initialStateArraySegmentedControl objectAtIndex:0] withColor1:myUIColor3 withColor2:myUIColor4];
break;
case 1:
[self myShineGradient:[initialStateArraySegmentedControl objectAtIndex:0] withColor1:myUIColor1 withColor2:myUIColor2];
[self myShineGradient:[initialStateArraySegmentedControl objectAtIndex:1] withColor1:myUIColor3 withColor2:myUIColor4];
break;
// (...)
}
// (...)
}
其中myColor1和2是中性颜色(UIColor)为未选定的段和3 + 4为您选择的 ,如果您只需要一种颜色将1颜色设置为第二个(和3 = 4)。
initialStateArraySegmentedControl是你segmentedControl的初始阵列(也可以单击时偶然秩序,但于需要最初的一个),所以在你的init试试这个:
initialStateArraySegmentedControl = self.segmentedControl.subviews;
[self setColorForBackGround:self.segmentedControl withColor1:myUIColor1 withColor2:myUIColor2];
最后一行是保持角落周围的分段控制主视图
和:
- (void)myShineGradient:(UIView*)myView withColor1:(UIColor*)color1 withColor2:(UIColor*)color2
{
// remove old personal shine layer (if any exists):
int layerNumberNow = [[myView.layer sublayers] count];
if (layerNumberNow>2) {
[[[myView.layer sublayers] objectAtIndex:0] removeFromSuperlayer];
}
// add shine layer
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
[gradientLayer setBounds:[myView bounds]];
// Center the layer inside the parent layer
[gradientLayer setPosition:
CGPointMake([myView bounds].size.width/2,
[myView bounds].size.height/2)];
// Set the colors for the gradient to the
// two colors specified for high and low
[gradientLayer setColors:
[NSArray arrayWithObjects:
(id)[color1 CGColor],(id)[color2 CGColor], nil]];
[myView.layer insertSublayer:gradientLayer atIndex:layerNumberNow-2];
}
- (void)setColorForBackGround:(UIView*)myView withColor1:(UIColor*)color1 withColor2:(UIColor*)color2
{
// add shine layer
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
[gradientLayer setBounds:[myView bounds]];
// Center the layer inside the parent layer
[gradientLayer setPosition:
CGPointMake([myView bounds].size.width/2,
[myView bounds].size.height/2)];
// Set the colors for the gradient to the
// two colors specified for high and low
[gradientLayer setColors:
[NSArray arrayWithObjects:
(id)[color1 CGColor],(id)[color2 CGColor], nil]];
[myView.layer setBackgroundColor:[ [UIColor colorWithRed:0 green:0 blue:0 alpha:0] CGColor]];
[myView.layer setCornerRadius:4];
[[myView layer] setMasksToBounds:YES];
// Display a border around the button
// with a 1.0 pixel width
[[myView layer] setBorderWidth:1.0f];
[[myView layer] setBorderColor:[ [UIColor colorWithRed:1 green:1 blue:1 alpha:.1] CGColor] ];
///
}
PS 需要导入石英FRAM ework
这看起来非常好,你能发布源? – Andyy 2011-12-19 07:14:32
@andy:来源?你的意思是“代码”?我做了,几乎所有你需要的,你只需要声明UIColor(s)和initialStateArraySegmentedControl作为NSArray ...把这段代码放在拥有SegmentedControl的UIViewController中...你还需要什么?你有什么疑问? – meronix 2011-12-19 08:29:34
这似乎删除了分段控件上的圆角。有什么方法可以保留它们吗? – MobileMon 2013-06-10 15:35:08