【问题标题】:Scroll dynamic UISegmentedControl in Swift 3在 Swift 3 中滚动动态 UISegmentedControl
【发布时间】:2018-03-13 04:10:30
【问题描述】:

您好,我想创建一个包含 20 多个项目的动态 UISegmented 视图。我试过了,但输出是这样的。

文本被切片不完全可见。我希望它左右滚动并显示全文。有人可以帮我解决这个问题。 tnx

视图控制器

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)")
}

【问题讨论】:

  • 使用滚动视图。将您的段控制器添加到滚动视图中。
  • 使用分段控件以外的东西。也许是一个选择器视图。
  • 将您的段控件嵌入到滚动视图中。还可以通过设置其框架来限制段控件以显示 3,4 个可见文本。
  • 可能,让分段控件包含 20 个项目不是良好的用户体验,您可能需要为其选择另一个合适的视图,例如选择器视图或表格视图...

标签: ios swift uisegmentedcontrol human-interface


【解决方案1】:

试试这个https://github.com/lestadNew/SASScrolletSegment,我没有找到解决方案并编写自己的可可豆荚

希望对你有帮助

【讨论】:

  • 如果你想更新这个 CocoaPods 给我写信,我会修复
【解决方案2】:

你可以试试

[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];

segment.apportionsSegmentWidthsByContent = YES;

斯威夫特:

类似的,

   UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
   segment.apportionsSegmentWidthsByContent = true

您可以在滚动视图中进行分段控制。但是对于UISegmentedControl,您不应使用超过四个或五个段。它的主要目的是显示三个或四个选项!你应该尝试不同的机制来实现你的目标!

如果有帮助,您也应该参考this post

【讨论】:

    【解决方案3】:

    最好使用另一个控制器而不是分段控制器来实现您的目标。

    但是如果你只使用段控制器,那么你必须将段控制器添加到滚动视图,因为标题是动态的,所以我们无法识别它有多宽,这就是原因。

    首先将段控制器添加到滚动视图。并且段控制器有方法名称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.
    

    【讨论】:

    • 试过你的解决方案,对于大量的段(〜> 8)很好,但是如何管理宽度,如果我只有2-3段,在这种情况下,它会缩小宽度并将所有段移动到段视图的最左侧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2018-02-09
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多