5

有没有办法摆脱 UISegmentedControl 的圆角或者它是默认行为?

4

6 回答 6

20

您可以做一些非常简单的事情来摆脱 UISegmentedControl 上的圆形垃圾......将样式更改为“7”。我不是在开玩笑。我刚刚想通了:

    // Magic number ... (it's cheating, but it works)
  mySegmentedBar.segmentedControlStyle = 7;  

这与他们在 UISearchBar 的范围栏中使用的控件样式相同,如下所示:

带范围的搜索栏

但是,如果有人只想要范围栏,而不需要搜索,他们通常会遇到这样的 UISegmentedControl 垃圾(带有圆角):

酒吧风格

或者更糟糕的是,这...

边框样式

值得庆幸的是,通过切换到 bar 样式“7”,我们得到了 stop bar 的确切外观,没有所有的子类化和 drawRect 黑客:

在此处输入图像描述

于 2011-12-02T21:01:01.077 回答
5

不,没有 API 可以让您控制段的布局。

您可能可以尝试查看 UISegmentedControl 的 view.subviews 并尝试根据您的需要更改它们。但从个人经验来看,我不建议这样做。如果 Apple 将来更改订单,您的应用程序可能会崩溃。最简单的做法是创建自定义 UIButtons,其行为类似于切换按钮,并像 UISegmentedControls 一样控制它们(有关切换按钮,请参阅如何使用 UIButton 作为切换开关)。

于 2009-12-02T17:33:55.950 回答
1

如果您想要不同的外观,您可以将其子类化并在-drawRect:. 有关使用 Quartz/Core Graphics 进行绘图的参考,请参阅Quartz 2D 编程指南

于 2009-12-03T17:58:38.757 回答
1

通过添加合理宽度的边框,您可以获得方形外观:

self.segmentedControl.tintColor = [UIColor brownColor];
self.segmentedControl.layer.cornerRadius = 0.0;
self.segmentedControl.layer.borderColor = [UIColor brownColor].CGColor;
self.segmentedControl.layer.backgroundColor = [UIColor colorWithWhite:1 alpha:0.75].CGColor;
self.segmentedControl.layer.borderWidth = 1.5f;
self.segmentedControl.layer.masksToBounds = YES;
于 2015-11-02T12:21:46.930 回答
0

经过大量尝试后,我得到了以下解决方案,该解决方案在没有任何背景图像或子类的情况下工作正常:

    mySegmentedControl.tintColor = [UIColor clearColor]; //Clear all border

    //Draw your own border
    mySegmentedControl.layer.borderColor = [UIColor blackColor].CGColor;
    mySegmentedControl.layer.borderWidth = 1.0;

    //Set tint color for selected subview
    UIColor *tintcolor=[UIColor redColor];
    int subViewIndex = 0; //index which is selected
    [[_segmentControl.subviews objectAtIndex:subViewIndex] setTintColor:tintcolor]; 
于 2014-10-15T09:06:02.877 回答
0

如果有人仍然感兴趣,这里是 Swift 4 (iOS 11) 中的简单扩展。只需确保在调用此方法之前设置了色调颜色。如果您之后更改色调颜色,请确保再次调用此方法:

extension UISegmentedControl {

func ignoreCornerRadius() {

    let renderer = UIGraphicsImageRenderer(size: bounds.size)

    let normalImage = renderer.image { (context) in
        tintColor.setStroke()
        context.stroke(bounds)
    }
    let selectedImage = renderer.image { (context) in
        tintColor.setFill()
        context.fill(bounds)
    }

    setBackgroundImage(normalImage, for: .normal, barMetrics: .default)
    setBackgroundImage(selectedImage, for: .selected, barMetrics: .default)

}

}

于 2018-07-08T18:04:45.283 回答