我可以翻译这个问题:我能否垂直显示一个UISegmentedControl对象?

22
有人可以教我如何使 UISegmentedControl 对象以垂直方向显示,而非水平方向吗?
5个回答

29

您可以随时修改分段控件的变换。

segmentedControl.transform = CGAffineTransformMakeRotation(M_PI / 2.0);


+1 回答问题 :)。我确实想知道旋转分段控件的可用性。 - RedBlueThing
1
是的,我并没有评判这是否是个好主意;-) - Ben Gottlieb
1
@ben-gottlieb 一种令人钦佩的品质 :) - RedBlueThing
这个问题很老了,但我遇到了它,想知道为什么要使用 M_PI / 2.0 而不是 M_PI_2 - BFeher
这是旧的 :) 但如果控件被定制为垂直布局的外观,则可用性可能非常好。我的使用情况是一个带有选项卡的垂直菜单栏。UISegmentedControl 对此非常完美,因为它可以跟踪所选/取消选择状态,并且一次只允许选择一个(或没有)。 - SaltyNuts

23

+1给Ben的回答,尽管旋转分段控件也会旋转内部文本。不要担心!我们只需要旋转内部标签,像这样:

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

1
这对标签很有效,但如果您的控件使用图像,则无法正常工作。在这种情况下,我会遵循Ben的建议,然后只需在OSX预览工具(或Photoshop)中旋转图像,而不是尝试在代码中旋转UIImageView。 - R.S
3
这段代码依赖于UISegmentedControl的内部(未记录)实现。每当苹果更改此控件的实现时,它就容易出现故障。即使是简单的更改,例如在您寻找的UILabel实例和顶层之间插入额外的视图层,也会破坏此代码。 - Arda
@Arda 可能会出现问题,但如果是这种情况,发明自己的分段控制器并完成相同的任务大约需要10分钟左右,所以去做吧,享受它。无论如何,很可能你总能找到一种方法来解决这个问题。 - Sethmr
@Sethmr 嗯,我已经花了大约10分钟的时间在我发表那条评论时发明了自己的替代品。我的警告是针对那些可能想要使用被接受答案中的代码的人。像你说的那样,编写自己的版本只需要10分钟。因为更新已发布的应用程序以使其与新的iOS版本兼容是一个更大、更长的过程,大多数开发者应该避免这种情况。这只是我的个人意见。 - Arda
这不再是一个理论问题了!在iOS 11下会出现错误。 - benzado

5

这个控件只能水平使用。根据UISegementedControl文档:

一个 UISegmentedControl 对象是一个水平控件,由多个片段组成,每个片段都作为一个离散按钮的功能。分段控件提供了一种紧凑的方式来将多个控件组合在一起。

您将需要将其作为自定义控件实现。


3

更新Ben的回答,以适应更现代的Swift版本。

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

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


0
我在cocoa controls中找到了下面这个看起来不错的控件。它是一个自定义控件,看起来像UIControl的子类。 smverticalsegmentedcontrol 但是如果你问我,我可能会尝试一种不同的方法,我将创建一个带有列宽(44px)的表格视图,并将其作为容器的子项,并可能将其对齐到容器的一个角落,自定义单元格并在其中列出我的列表,在点击每一行时,在内容视图中加载相应的内容详细信息。我还没有尝试过,但很快会尝试并发布结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接