【问题标题】:Can I show an UISegmentedControl object in vertical?我可以垂直显示 UISegmentedControl 对象吗?
【发布时间】:2020-06-07 08:06:00
【问题描述】:

有没有人可以教我如何在垂直方向而不是水平方向显示 UISegmentedControl 对象?

【问题讨论】:

    标签: iphone sdk uisegmentedcontrol


    【解决方案1】:

    您始终可以修改分段控件上的转换。

    segmentedControl.transform = CGAffineTransformMakeRotation(M_PI / 2.0);

    【讨论】:

    • +1 用于回答问题:)。我确实想知道旋转分段控件的可用性。
    • 是的,我并没有判断这是否是一个好主意;-)
    • @ben-gottlieb 令人钦佩的品质 :)
    • 这已经很老了,但我遇到了它,想知道为什么使用M_PI / 2.0 而不是M_PI_2
    • 这是旧的 :) 但如果自定义控件以使其看起来适合垂直布局,则可用性会非常好。我的用例是带有标签的垂直菜单栏。 UISegmentedControl 非常适合,因为它跟踪选中/取消选中的状态,并且一次只允许一个(或没有)选择。
    【解决方案2】:

    Ben 的回答 +1,虽然旋转分段控件也会旋转里面的文本。从不畏惧!我们只需要旋转内部标签,如下所示:

        NSArray *arr = [segmentedControl subviews];
        for (int i = 0; i < [arr count]; i++) {
        UIView *v = (UIView*) [arr objectAtIndex:i];
        NSArray *subarr = [v subviews];
            for (int j = 0; j < [subarr count]; j++) {
                if ([[subarr objectAtIndex:j] isKindOfClass:[UILabel class]]) {
                    UILabel *l = (UILabel*) [subarr objectAtIndex:j];
                    l.transform = CGAffineTransformMakeRotation(- M_PI / 2.0); //do the reverse of what Ben did
                }
            }
        }
    

    Swift 2 版本:

    for view in segmentedControl.subviews {
        for subview in view.subviews {
            if subview.isKindOfClass(UILabel) {
                subview.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI / 2.0))
            }
        }
    }
    

    【讨论】:

    • 这适用于标签,但如果您的控件有图像,它就不起作用。在这种情况下,我会按照 Ben 的建议,然后在 OSX 预览工具(或 Photoshop)中旋转图像,而不是尝试在代码中旋转 UIImageView。
    • 此代码依赖于 UISegmentedControl 的内部(未记录)实现。每当 Apple 更改此控件的实现时,它都容易失败。即使是简单的更改,例如在您正在寻找的 UILabel 实例和顶层之间插入额外的视图层,也会破坏此代码。
    • @Arda 它可能会坏掉,但是如果是这样的话,你需要大约 10 分钟来发明你自己的分段控制器来做同样的事情,所以去做并享受它。很有可能,如果发生任何变化,您总能找到一种方法来做到这一点。
    • @Sethmr 好吧,在我发布该评论时,我已经花了大约 10 分钟来发明自己的替代方案。我的警告是针对任何可能想要在接受的答案中使用代码的人。正如你所说,编写自己的版本只需要 10 分钟。对已经发布的应用程序进行更新,因为它与新的 iOS 版本中断是一个更大、更长的过程,大多数开发人员应该努力避免。只是我的意见。
    • 不再是理论问题!这在 iOS 11 下会中断。
    【解决方案3】:

    此控件仅是水平的。来自UISegementedControl 文档:

    一个 UISegmentedControl 对象是一个 水平控制由多个 段,每个段作为 一个独立的按钮。分段控制 提供了一种紧凑的分组方式 多个控件。

    您必须将其作为自定义控件执行。

    【讨论】:

      【解决方案4】:

      更新 Bens 答案以获得更现代的 swift 版本。

      segmentedControl.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
      

      注意将值转换为 CGFloat 并使用更现代的 Double.pi(也可以缩短为 .pi。

      【讨论】:

        【解决方案5】:

        我在可可控件中发现了下面的控件,看起来不错。它是一个自定义控件,看起来像 UIControl 的子类。

        smverticalsegmentedcontrol

        但是如果你问我,我可能会尝试一种不同的方法,我会创建一个列宽(44px)的 tabelview 并将它作为一个子项保存在容器中,并且可以将它与容器的一个角对齐,自定义单元格并在其中列出我的列表,然后点击每一行,在您的内容视图的详细信息视图中加载相应的内容。没试过,会尽快发布结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 2018-06-25
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多