【问题标题】:How can I enable multiple segments of a UISegmentedControl to be selected?如何启用要选择的 UISegmentedControl 的多个段?
【发布时间】:2010-11-05 00:00:15
【问题描述】:

假设我的 UISegmentedControl 有 8 个编号的段。我希望用户能够一次打开 2 个、3 个或更多。切换它们。本质上就像一个字节中的一个位。这可能吗?我相信它在常规的 Mac OS X 上,但我似乎无法在 iPhone SDK 中找到一种方法。

如果我必须通过将按钮放入视图来模拟这一点,有什么方法可以执行以下操作:

  1. 圆角视图,使其看起来像“条形”样式 UISegmentedControl?
  2. 使用“条形”样式在按钮上的内置背景?
  3. 像整个“条形”样式那样给按钮一个阴影? (不是文字)

【问题讨论】:

    标签: iphone uisegmentedcontrol


    【解决方案1】:

    我认为最简单的方法是使用 UIButton 创建自己的分段控件。

    马可

    【讨论】:

    • 实现这一点的一种方法是我在发布应用程序时所做的,即使用带有圆角边缘的 UILabel 并将矩形 UIButtons 放入其中。这样,您可以获得组合控件的圆角边缘。享受吧。
    【解决方案2】:

    这在 UIKit 中是不可能的。我建议创建一个自定义控件,或一组 UISwitch 控件,代表 UISegmentedControl 中的每个选项。

    【讨论】:

      【解决方案3】:

      现在在 XCode 中似乎有一种方法可以做到这一点。在 Attributes Inspector 中,有一个包含 Segment、Title、Image、Behavior 的部分。行为选项为“已启用”和“已选择”。您可以为多个细分选择“已选择”。

      【讨论】:

      • 我认为这行不通。在 Xcode 中,当我为一个段选择“已选择”时,其他段都未选中。 UISegmentedControl 的进一步方法包括 setEnabled:forSegmentAtIndex 但不包括 setSelected:forSegmentAtIndex (这很方便)。我正在尝试与 OP 做同样的事情,看来我需要创建一个自定义控件。有点讽刺意味,因为顶部 Xcode 本身的帮助按钮正是我正在拍摄的东西(虽然是 Mac 应用程序)。
      【解决方案4】:

      我建议你试试https://github.com/tayhalla/THSegmentedControl
      它是UISegmentedControl 的实际子类,因此它非常适合Interface builder 和所有内容。

      【讨论】:

      • 它是UIControl 不是UISegmentedControl 的子类
      【解决方案5】:

      更新:我在这里提到的自定义控件在 iOS 13 下不再工作。

      这是我发现的最好的自定义控件,它允许同时选择多个段:

      https://github.com/yonat/MultiSelectSegmentedControl

      这个是UISegmentedControl的子类,比较方便。我在这里分叉了:

      https://github.com/stewartmacdonald/MultiSelectSegmentedControl

      并在自述文件中添加了一些代码示例,并添加了一个允许您获取所有选定片段标题的 NSArray 的方法。

      【讨论】:

      • MultiSelectSegmentedControl 非常好。它扩展了UISegmentedControl,因此它的所有方法都可用。
      【解决方案6】:

      来自 Google 的回答:现在可以更改 UISegmentedControl 的行为。转到检查器-> 模式-> 选择任何而不是选择一个。 要找出选择了哪些段,我建议创建一个像这样的函数:

      extension UISegmentedControl {
          func getBarState() -> [Bool] {
              var states: [Bool] = []
              for i in 0..<segmentCount {
                  states.append(isEnabledForSegment(forSegment: i))
              }
              return states
          }
      }
      

      由于 Google 在搜索 OSX 版本时将我带到这里,我还将发布 NSSegmentedControl 的有效解决方案:

      extension NSSegmentedControl {
          func getBarState() -> [Bool] {
              var states: [Bool] = []
              for i in 0..<segmentCount {
                  states.append(isSelected(forSegment: i))
              }
              return states
          }
      }
      

      【讨论】:

      • 这很好,但是在 Xcode 11.5 的属性检查器(或其他)中,我找不到模式 -> 选择您提到的任何/一个。我错过了什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多