【问题标题】:Creating a UIScrollView subclass in code, where do I add a subviews to it?在代码中创建 UIScrollView 子类,在哪里添加子视图?
【发布时间】:2014-11-15 19:11:40
【问题描述】:

每次我创建我的UIScrollView 子类时,我都会向它添加一个UIImageView。我从滚动视图的init 方法中获取UIImageView 的图像,其中我传递了UIImage

但是我在哪里添加这个子视图?通常我会在awakeFromNib 中执行此操作,但这是以编程方式创建的。在 init 方法中弄乱视图层次结构是一种不好的做法。

我应该在哪里做?

【问题讨论】:

  • 我认为没有好地方可以做这件事意味着这可能不是一个好方法......是否可以从包含滚动视图的视图控制器构建视图层次结构?您将创建scrollView,然后将imageView 添加到scrollView。然后,将 imageview 的所有边缘约束到 scrollView。调用 imageview.sizeToFit,它会自动让自己在 scrollView 的范围内滚动。
  • ^ 可能是最好的建议,除非有充分的理由为您的 UIScrollView 创建一个新类。
  • @AnnaDickinson 我不明白,UIButton 之类的有一个titleLabel 属性,即按钮标题的UILabel。他们如何自动设置 UIView? UIView 子类不能自动由其他子 UIViews 组成,这似乎很奇怪,尤其是当它很容易使用 Interface Builder/nibs 时。一定有办法的。
  • 更多讨论:stackoverflow.com/questions/15978370/… @Acey - 是的,我改变了主意。听起来您在初始化期间创建了子视图。然后,您可以在 layoutSubviews 中移动它们/调整它们的大小。我认为您会在 layoutSubviews 中设置 scrollView 内容大小,以便它可以处理可能调整大小的 imageView。 ....我不知道,我最近一直在讨论这整个问题并接受自动布局。 :-)
  • @AnnaDickinson 尽管我很想这样做,但滚动视图和自动布局仍然看起来很糟糕。

标签: ios objective-c cocoa-touch uiview uiscrollview


【解决方案1】:

对于UIView 子类,init 是您应该添加子视图的位置。例如,想想如果你创建了一个UIButton,你会不会期望它马上就有一个titleLabel

【讨论】:

  • 我认为 OP 是正确的:init 不是正确的地方。在 Obj-C 中,不能保证对象在初始化之后(或期间)立即准备就绪。我认为这就是 Swift 中严格的初始化要求背后的动机。对于 UIKit 组件,最好等到定义了具体的东西;例如,在视图控制器中,您需要等到 viewDidLoad 才能触摸视图。
  • 不,这不可能。 UIView 子类在初始化后应该有它的结构,就像你期望它在从 nib 取消归档后有它的子视图一样。 UIViewController 不是 UIView 子类,因此在这里并不真正相关,但足以说明您不能访问插座或视图,因为它们是在您访问视图之前创建的。
【解决方案2】:

我会将它传递给您的 init,因为听起来您的滚动视图子类总是需要图像。

class ScrollViewCustom: UIScrollView {

    init(frame: CGRect, image: UIImage) {
        super.init(frame: frame)

        var imageView = UIImageView(frame: CGRectMake(0, 0, 100, 200)) // Just an example size
            imageView.image = image
    }
}

【讨论】:

  • 问题被标记为 Objective-C。用 Objective-C 而非 Swift 发表答案。
  • 不知道 Obj-C。我将保留我的答案而不是删除,因为我仍然认为这对 OP 看到实现很有帮助,即使特定语法不同,因为它是新语言。
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多