【问题标题】:Transform specific segment in segmented control在分段控制中变换特定段
【发布时间】:2017-12-09 22:39:58
【问题描述】:

有没有办法转换分段控件中包含的特定段的内容? (我必须将它旋转 180 度)

不是其中包含的图像,因为在我的情况下没有(我使用过 FontAwesome)

演示:

来自: 至:

【问题讨论】:

    标签: swift transform uisegmentedcontrol


    【解决方案1】:

    是的!

    假设我们有一个包含 3 个段的分段控件:

    实际上,它是一个包含 3 个subviews 的视图,输入为UISegment。如果我们尝试打印这个分段控件subviews(假设我们将它连接到所需的视图控制器为segmentedControlIBOutlet):

    class ViewController: UIViewController {
        // MARK:- IBOutlets
        @IBOutlet weak var segmentedControl: UISegmentedControl!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            for view in segmentedControl.subviews {
                print(view)
            }
        }
    }
    

    日志应该显示类似于:

    UISegment: 0x7febebc06980;帧 = (229 0; 114 29);层=CALayer: 0x60000002edc0 UISegment:0x7febebe140c0;帧 = (114 0; 114 29);层=CALayer:0x618000231800 UISegment:0x7febebe14d30;帧 = (0 0; 113 29);层=CALayer:0x6180002319c0

    因此,您可以将分段控件中的分段作为UISegment 访问,从而将所需的编辑作为 UIView 应用到它。例如,如果你想旋转第二段,你可以实现:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        for view in segmentedControl.subviews[1].subviews {
            print(view)
            view.transform = CGAffineTransform(scaleX: -1, y: 1)
        }
    }
    

    如你所见,段也有子视图:

    UISegmentLabel: 0x7f8b51701770;帧 = (0 0; 64 22.5);文字= '第二';不透明=否;用户交互启用 = 否;层= _UILabelLayer: 0x610000091530

    UIImageView: 0x7f8b51701470;帧 = (114 0; 1 1);阿尔法 = 0;不透明 = 不;自动调整大小 = LM;用户交互启用 = 否;标签 = -1030;层= CALayer:0x610000031480

    因此,您应该旋转所有这些子视图,如上面代码 sn-p 中所实现的那样。

    输出将是:


    同样的方法应该适用于具有图像而不是标题的分段控件:

    旋转前:

    旋转后:

    【讨论】:

    • 您能说说是什么问题吗?您是否尝试过打印答案中提到的分段控件的子视图?我认为你可能会错过一些东西......
    • 打印效果几乎一样,但视图没有改变。
    • 如果打印相同(它包含 UISegment 的子视图),那么它应该可以正常工作...如果您认为上述代码的特定部分不起作用,请告诉我它。我可能会创建一个 repo 并分享它...
    • 在 iOS 13 中,我遇到了一个错误,导致子视图返回 3 个 UISegment 实例以及 3 个 UIImageView 实例。所以总共有6个子视图。由于 UISegment 是私有的,因此难以访问 UISegment。
    【解决方案2】:

    Segment 是一个小的 UIView,你可以对它应用一个转换。

    获取子视图参考这个问题:

    UISegmentedControl selected segment color

    并参考另一个来“旋转”内容。

    How to rotate UIView using transform

    再一次,我只是更容易用它制作图像并使用它。

    【讨论】:

    • 谢谢@Pochi。然而,当整个 UIView 被镜像时,其他一些属性也会被翻转,比如那些圆形边框。我现在已经编辑了这个问题 - 要求翻转 UIView 的内容而不是 UIView 本身。 P.S.:UIView 不包含 UILabel。它包含一个名为 UISegmentLabel 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多