如何更改UISegmentedControl的转角半径?

时间:2014-04-26 23:30:54

标签: ios cocoa-touch uiview uikit uisegmentedcontrol

是否可以更改UISegmentedControl的转角半径?我尝试过以下方法来改变UIView的角半径。

    self.segmentedControl.layer.cornerRadius = 15.0;
    self.segmentedControl.layer.masksToBounds = YES;

这不起作用,因为你可以看到它只切断了UISegmentedControl的角落。  enter image description here

谢谢!

12 个答案:

答案 0 :(得分:92)

这应该有效:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

struct MyInfo{
    std::string name;
    MyInfo(const std::string& s) : name(s) {}
    MyInfo() {}
};

int main (int argc, char** argv)
{
  ifstream file("myfile.txt");
  string line;

  if (!file){
     // handle error
     return;
  }

   while (file){
      getline(file, line);
      MyInfo m(line); // this is your MyInfo object
      // ...
   }
}

您需要在设置cornerRadius后指定边框。

答案 1 :(得分:32)

在UIView中嵌入UISegmentedControl并为 UIView 设置角半径。

目标C

outerView.layer.cornerRadius = CGRectGetHeight(outerView.bounds) / 2;
outerView.layer.borderColor = [UIColor blueColor].CGColor;
outerView.layer.borderWidth = 1;

夫特

outerView.layer.cornerRadius = CGRectGetHeight(outerView.bounds) / 2
outerView.layer.borderColor = UIColor.blueColor().CGColor
outerView.layer.borderWidth = 1

Cornered UISegmentedControl

答案 2 :(得分:9)

分段控制不会改变它的角落,所以它继续以自己的方式绘制角落,然后你将它们切断。您不负责分段控件如何绘制其边界形状。如果你真的不喜欢它的绘制方式,你必须从头开始设计自己的替代控制。你可以合理地接近你想要做的事情就是设置分段控件的背景图像。

答案 3 :(得分:6)

iOS 13/14-终于可以正常工作了!

image alt

我决定再试一次,终于使它运转完美!! 有一行代码可以解决所有问题!签出代码

代码

class CustomSegmentedControl: UISegmentedControl{
    private let segmentInset: CGFloat = 5       //your inset amount
    private let segmentImage: UIImage? = UIImage(color: UIColor.red)    //your color

    override func layoutSubviews(){
        super.layoutSubviews()

        //background
        layer.cornerRadius = bounds.height/2
        //foreground
        let foregroundIndex = numberOfSegments
        if subviews.indices.contains(foregroundIndex), let foregroundImageView = subviews[foregroundIndex] as? UIImageView
        {
            foregroundImageView.bounds = foregroundImageView.bounds.insetBy(dx: segmentInset, dy: segmentInset)
            foregroundImageView.image = segmentImage    //substitute with our own colored image
            foregroundImageView.layer.removeAnimation(forKey: "SelectionBounds")    //this removes the weird scaling animation!
            foregroundImageView.layer.masksToBounds = true
            foregroundImageView.layer.cornerRadius = foregroundImageView.bounds.height/2
        }
    }
}

extension UIImage{
    
    //creates a UIImage given a UIColor
    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }
}

这个想法是苹果使用UIImageView带有自己的正方形图像并为选定的移动段着色。我们要做的是改写其图像,以便我们可以控制颜色,角半径等。此后,我们要删除Apple的3种默认动画之一(有问题的动画使该段在触摸时会放大- -我使用foregroundImageView.layer.animationKeys()来找出哪些动画在影响移动的片段)

答案 4 :(得分:5)

更新了Swift 3&amp; Xcode 8.2兼容性

    mySegmentedControl.layer.cornerRadius = 25.0
    mySegmentedControl.layer.borderColor = UIColor.white.cgColor
    mySegmentedControl.layer.borderWidth = 1.0
    mySegmentedControl.layer.masksToBounds = true

答案 5 :(得分:5)

您可以通过增加 cornerRadius 层来更改 UISegmentedControl 角半径,或者通过设置 iOS 13及更高版本来更改 UISegmentedControl maskedCorner 属性。

此示例删除默认的 cornerRadius 并拉直 backgroundImage

//normal function
  @Transactional
   void saveTransaction(String uniqueId) {
       Transaction transaction = new Transaction();
       transaction.setUniqueId(uniqueId);
       transactionRepository.save(transaction);
   }

   **@Transactional**  //Error Message - @Transactional not applicable to this field
   Consumer<String> saveTransaction = (uniqueId) ->
   {
       Transaction transaction = new Transaction();
       transaction.setUniqueId(uniqueId);
       transactionRepository.save(transaction);
   };

来源: https://developer.apple.com/documentation/quartzcore/calayer/2877488-maskedcorners

答案 6 :(得分:4)

你的结果是因为其他东西(自定义绘图?)控制边框而不是图层。幸运的是,图层设置似乎具有优先权。

如果您知道所需的边框颜色,可以添加(示例):

self.segmentedControl.layer.borderColor = [UIColor whiteColor].CGColor;
self.segmentedControl.layer.borderWidth = 1.0;

答案 7 :(得分:4)

之前的解决方案从未对我有用。我的解决方案是:

要将UISegmentedControl嵌入到超级视图中,然后将-1分配给约束前导,尾随,底部,顶部,以便切断UISegmentedControl边框。 最后,superview应该以这种方式配置:

segmentedControl.superview.clipsToBounds = true
segmentedControl.superview.layer.cornerRadius = 0 //whatever
segmentedControl.superview.layer.borderWidth = 1
segmentedControl.superview.layer.borderColor = segmentedControl.tintColor.CGColor

答案 8 :(得分:3)

这是[{3}}的 Swift 4.1和Xcode 9.3 的转换和工作代码。

segmentedOuterView.layer.cornerRadius = segmentedOuterView.bounds.height / 2
segmentedOuterView.layer.borderColor = UIColor.red.cgColor
segmentedOuterView.layer.borderWidth = 1
segmentedOuterView.layer.masksToBounds = true

答案 9 :(得分:3)

iOS13中有一些更改。因此,您必须在layoutSubviews内设置borderRadius:

override func layoutSubviews() {
    super.layoutSubviews()
    layer.cornerRadius = 2
}

答案 10 :(得分:1)

使用以下代码:

segmentContrl.layer.borderColor=*anycolor*.CGColor;
segmentContrl.layer.cornerRadius = 0.0;
segmentContrl.layer.borderWidth = 1.5f;

答案 11 :(得分:0)

可能没有layer。你可以尝试

segmentedControl.borderColor = UIColor.line
segmentedControl.borderWidth = 1
segmentedControl.cornerRadius = 8