我是iOS开发的新手,在为课程构建应用程序时遇到了一些麻烦.
我创建了一个分段控件,它的init函数(如下所示)在包含分段控件的视图控制器类中调用.我能够从分段控件类中删除分段控件的所有边框和分隔符,如下所示:
import Foundation
import UIKit
class CashSegmentedControl: UISegmentedControl{
func initUI(){
removeBorders()
}
func removeBorders(){
self.tintColor = UIColor.clear
}
我希望它在每个段下面都有一条线当选择了段时(类似于instagram)
我搜索了很多,并在StackOverflow上发现了一些帖子,但它们似乎是旧版本的Swift.我真的很感激这方面的任何帮助,如果有更好的解决方案来定制边界(除了我所做的),我想要了解更多!
非常感谢 :)
解决方法
在单独的swift文件中添加以下代码(命令N – >新文件):
extension UISegmentedControl{
func removeBorder(){
let backgroundImage = UIImage.getColoredRectimageWith(color: UIColor.white.cgColor,andSize: self.bounds.size)
self.setBackgroundImage(backgroundImage,for: .normal,barMetrics: .default)
self.setBackgroundImage(backgroundImage,for: .selected,for: .highlighted,barMetrics: .default)
let deviderImage = UIImage.getColoredRectimageWith(color: UIColor.white.cgColor,andSize: CGSize(width: 1.0,height: self.bounds.size.height))
self.setDividerImage(deviderImage,forLeftSegmentState: .selected,rightSegmentState: .normal,barMetrics: .default)
self.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.gray],for: .normal)
self.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor(red: 67/255,green: 129/255,blue: 244/255,alpha: 1.0)],for: .selected)
}
func addUnderlineForSelectedSegment(){
removeBorder()
let underlinewidth: CGFloat = self.bounds.size.width / CGFloat(self.numberOfSegments)
let underlineHeight: CGFloat = 2.0
let underlineXPosition = CGFloat(selectedSegmentIndex * Int(underlinewidth))
let underLineYPosition = self.bounds.size.height - 1.0
let underlineFrame = CGRect(x: underlineXPosition,y: underLineYPosition,width: underlinewidth,height: underlineHeight)
let underline = UIView(frame: underlineFrame)
underline.backgroundColor = UIColor(red: 67/255,alpha: 1.0)
underline.tag = 1
self.addSubview(underline)
}
func changeUnderlinePosition(){
guard let underline = self.viewWithTag(1) else {return}
let underlineFinalXPosition = (self.bounds.width / CGFloat(self.numberOfSegments)) * CGFloat(selectedSegmentIndex)
UIView.animate(withDuration: 0.1,animations: {
underline.frame.origin.x = underlineFinalXPosition
})
}
}
extension UIImage{
class func getColoredRectimageWith(color: CGColor,andSize size: CGSize) -> UIImage{
UIGraphicsBeginImageContextWithOptions(size,false,0.0)
let graphicsContext = UIGraphicsGetCurrentContext()
graphicsContext?.setFillColor(color)
let rectangle = CGRect(x: 0.0,y: 0.0,width: size.width,height: size.height)
graphicsContext?.fill(rectangle)
let rectangleImage = UIGraphicsGetimageFromCurrentimageContext()
UIGraphicsEndImageContext()
return rectangleImage!
}
}
然后从viewDidLoad()方法调用segmentedControl.addUnderlineForSelectedSegment()之后,为分段控件创建一个@IBAction方法,如下所示:
@IBAction func segmentedControlDidChange(_ sender: UISegmentedControl){
segmentedControl.changeUnderlinePosition()
}
然后从此方法中调用segmentedControl.changeUnderlinePosition().
不要忘记将故事板中的分段控件连接到刚刚创建的@IBAction方法.
非常重要:不要忘记在故事板中使用自动布局来确定分段控件的大小和位置.
这是结果:
随意问你可能有的任何其他问题:)