在 Swift 3 中滚动动态 UISegmentedControl
Scroll dynamic UISegmentedControl in Swift 3
您好,我想创建一个包含 20 多个项目的动态 UISegmented 视图。我试过了,但输出是这样的。
文本被切片,无法完全显示。我希望它向左和向右滚动并显示全文。有人可以帮我解决这个问题吗?发送
视图控制器
override func viewDidLoad() {
super.viewDidLoad()
let items = ["All Fruits", "Orange", "Grapes", "Banana", "Mango", "papaya", "coconut", "django"]
let filtersSegment = UISegmentedControl(items: items)
filtersSegment.frame = CGRect.init(x: 10, y: 60, width: 300, height: 50)
filtersSegment.selectedSegmentIndex = 0
filtersSegment.tintColor = UIColor.black
filtersSegment.addTarget(self, action: #selector(self.filterApply), for: UIControlEvents.valueChanged)
self.view.addSubview(filtersSegment)
}
@objc private func filterApply(segment:UISegmentedControl) -> Void {
print("Selected Index : \(segment.selectedSegmentIndex)")
}
最好使用另一个控制器而不是分段控制器来实现您的目标。
但是,如果您只使用段控制器,则必须将段控制器添加到滚动视图,因为标题是动态的,所以我们无法识别它有多宽,这就是原因。
首先将段控制器添加到滚动视图。段控制器有方法名称 setWidth(_ width: CGFloat, forSegmentAt segment: Int)
来设置索引处每个段的宽度。
所以我在这里写我的逻辑。
var scrollViewWidth:Float = 0.0
let items = ["All Fruits", "Orange", "Grapes", "Banana", "Mango", "papaya", "coconut", "django"]
for (index, element) in items.enumerated() {
let size = element.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 20.0)]) //you can change font as you want
segmentCon.setWidth(size.width, forSegmentAt: index)
scrollViewWidth = scrollViewWidth + Float(size.width)
}
// Here you can set content width of UIScollView by use of "scrollViewWidth"
// scrollView.contentSize = CGSize(width: scrollViewWidth, height: 40)// height should whatever you want.
你可以试试
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
segment.apportionsSegmentWidthsByContent = YES;
Swift :
有点像,
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
segment.apportionsSegmentWidthsByContent = true
并且您可以在滚动视图中使用分段控件。但是对于 UISegmentedControl 你不应该使用超过四或五个段。它的主要目的是显示三个或四个选项!你应该尝试不同的机制来实现你的目标!
如果有帮助,您也应该参考!
试试这个 https://github.com/lestadNew/SASScrolletSegment,我没有找到解决方案并自己编写 cocoa pods
希望对您有所帮助
您好,我想创建一个包含 20 多个项目的动态 UISegmented 视图。我试过了,但输出是这样的。
文本被切片,无法完全显示。我希望它向左和向右滚动并显示全文。有人可以帮我解决这个问题吗?发送
视图控制器
override func viewDidLoad() {
super.viewDidLoad()
let items = ["All Fruits", "Orange", "Grapes", "Banana", "Mango", "papaya", "coconut", "django"]
let filtersSegment = UISegmentedControl(items: items)
filtersSegment.frame = CGRect.init(x: 10, y: 60, width: 300, height: 50)
filtersSegment.selectedSegmentIndex = 0
filtersSegment.tintColor = UIColor.black
filtersSegment.addTarget(self, action: #selector(self.filterApply), for: UIControlEvents.valueChanged)
self.view.addSubview(filtersSegment)
}
@objc private func filterApply(segment:UISegmentedControl) -> Void {
print("Selected Index : \(segment.selectedSegmentIndex)")
}
最好使用另一个控制器而不是分段控制器来实现您的目标。
但是,如果您只使用段控制器,则必须将段控制器添加到滚动视图,因为标题是动态的,所以我们无法识别它有多宽,这就是原因。
首先将段控制器添加到滚动视图。段控制器有方法名称 setWidth(_ width: CGFloat, forSegmentAt segment: Int)
来设置索引处每个段的宽度。
所以我在这里写我的逻辑。
var scrollViewWidth:Float = 0.0
let items = ["All Fruits", "Orange", "Grapes", "Banana", "Mango", "papaya", "coconut", "django"]
for (index, element) in items.enumerated() {
let size = element.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 20.0)]) //you can change font as you want
segmentCon.setWidth(size.width, forSegmentAt: index)
scrollViewWidth = scrollViewWidth + Float(size.width)
}
// Here you can set content width of UIScollView by use of "scrollViewWidth"
// scrollView.contentSize = CGSize(width: scrollViewWidth, height: 40)// height should whatever you want.
你可以试试
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
segment.apportionsSegmentWidthsByContent = YES;
Swift :
有点像,
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
segment.apportionsSegmentWidthsByContent = true
并且您可以在滚动视图中使用分段控件。但是对于 UISegmentedControl 你不应该使用超过四或五个段。它的主要目的是显示三个或四个选项!你应该尝试不同的机制来实现你的目标!
如果有帮助,您也应该参考
试试这个 https://github.com/lestadNew/SASScrolletSegment,我没有找到解决方案并自己编写 cocoa pods
希望对您有所帮助