如何在UISegmentedControl中仅显示所选项目的底部边框?
我是iOS开发的新手,在为课程构建应用程序时遇到了一些麻烦。
我创建了一个分段控件,它的init函数(如下所示)在包含分段控件的视图控制器类中调用。 我能够从分段控件类中删除分段控件的所有边框和分隔符,如下所示:
import Foundation import UIKit class CashSegmentedControl: UISegmentedControl{ func initUI(){ removeBorders() } func removeBorders(){ self.tintColor = UIColor.clear }
我希望它在每个段下面都有一条线当选择了段时(类似于instagram)
我搜索了很多,并在StackOverflow上发现了一些post,但它们似乎是旧版本的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, barMetrics: .default) self.setBackgroundImage(backgroundImage, 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, green: 129/255, blue: 244/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
方法。
非常重要 :不要忘记在故事板中使用自动布局来确定分段控件的大小和位置。
这是结果:
随意问你可能有的任何其他问题:)
A.Jam在Xcode 9.3,Swift 4.2版本中的答案
import UIKit 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, barMetrics: .default) self.setBackgroundImage(backgroundImage, 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([NSAttributedStringKey.foregroundColor: UIColor.gray], for: .normal) self.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: 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, green: 129/255, blue: 244/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! } }
你可以用它
let segmentBottomBorder = CALayer() segmentBottomBorder?.borderColor = UIColor.blue.cgColor segmentBottomBorder?.borderWidth = 3 let x = CGFloat(sender.selectedSegmentIndex) * width let y = sender.frame.size.height - (segmentBottomBorder?.borderWidth)! let width: CGFloat = sender.frame.size.width/3 segmentBottomBorder?.frame = CGRect(x: x, y: y, width: width, height: (segmentBottomBorder?.borderWidth)!) sender.layer.addSublayer(segmentBottomBorder!)
- 随机自定义视图select器
- 如何将Firebase SDK集成到iOS应用(SWIFT 4)
- 如何检测UITableView标题何时滚动到可见区域?
- 顶点着色器中的纹理查找在iPad设备与iPad模拟器上performance不同 – OpenGL ES 2.0
- CoreBluetooth在重新连接时不会发现服务
- GPUImagePicture与imageFromCurrentlyProcessedOutput不会得到UIImage
- 我如何解密签名并添加到目标c中的YouTube提取的URL?
- 使iOS应用程序与iPhone6和iPhone6 +尺寸兼容
- Swift还是Objective-C? 适用于iOS开发人员的工具提示。