【问题标题】:Segmented Control Subview from extension来自扩展的分段控制子视图
【发布时间】:2017-04-25 22:24:39
【问题描述】:

我正在尝试通过扩展在我的 UISegmentedControl 下方添加一个子视图,因此当我向此子视图添加更多属性时,它可以从应用程序中的其他 UISegmentedControl 重用。

它出现在正确的位置,但由于某种原因,有时会出现在某些片段的上方,有时会出现在下方。我错过了什么吗?

到目前为止,在我的扩展中,这就是我所拥有的:

import UIKit

extension UISegmentedControl {
    func addBackgroundView() {
        let backgroundView = UIView();
        backgroundView.frame = self.bounds;
        backgroundView.backgroundColor = UIColor.purple;
        self.insertSubview(backgroundView, belowSubview: self);
    }
}

然后,我从 ViewController 中的 viewDidLoad 方法调用扩展函数:

self.segmentedControlUnit.addBackgroundView();

【问题讨论】:

  • 通读答案中的 cmets,最好的解决方案是(1)子类 UIView 而不是 UISegmentedControl,(2)添加 UISegmentedControl 作为子视图,(3)公开你需要的那些东西每个类 - UIView 和 UISegmentedControl - 以及 (4) 添加您希望的自定义​​内容?或多或少,你能通过reversing顺序和subclassing而不是extending得到想要的结果吗?

标签: ios swift uisegmentedcontrol


【解决方案1】:

我不认为你能做到这一点。这是我选择第二段时的 UI 层次结构, 这是我选择第三段时的 UI 层次结构

因此段位置会根据您选择的段而变化。

【讨论】:

  • 这是我不明白的行为。这是一个错误还是什么?它不应该是上面的整个组件,而不仅仅是某些部分吗?我尝试从 Interface Builder 添加一个视图,它可以工作。通过代码不应该一样吗?
  • 我认为这是默认行为。您必须通过包装 UISegmentedControl 来为此创建自己的自定义控制器。而且你不能在 UISegmentedControl 下面添加子视图,因为所有子视图都存在于 UISegmentedControl 内。
  • 你可以试试这个segmentedControl.setBackgroundImage(UIImage(named: "purple_image") , for: .normal, barMetrics: .default)添加紫色图片作为背景。
  • 它看起来像是在更改段时将段发送到视图的后面 - 可能用 didSet 覆盖 var selectedSegmentIndex: Int 并尝试再次将背景视图发送到后面?
  • @Keaz 这可能有效,但正如我所说,我想用 backgroundView 做一些更复杂的事情。这不仅仅是添加背景颜色,我还需要下面的整体视图。
【解决方案2】:

尝试在索引 0 处插入 backgroundView 以确保它低于所有子视图

self.insertSubview(backgroundView, at: 0)

【讨论】:

  • 嗨 Luan,感谢您的建议,但仍然发生同样的情况
  • 您的期望是什么?也许我会有其他方法来做到这一点。
  • 如果您可以在附加的图像中看到某些片段中的某些片段,具体取决于按下的是哪个片段,紫色视图会出现在上方而不是下方,并且不允许读取片段文本。这就是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2017-09-26
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多