在代码中创建 UIScrollView 子类,在哪里添加子视图?

Posted

技术标签:

【中文标题】在代码中创建 UIScrollView 子类,在哪里添加子视图?【英文标题】:Creating a UIScrollView subclass in code, where do I add a subviews to it? 【发布时间】: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 时。一定有办法的。 更多讨论:***.com/questions/15978370/… @Acey - 是的,我改变了主意。听起来您在初始化期间创建了子视图。然后,您可以在 layoutSubviews 中移动它们/调整它们的大小。我认为您会在 layoutSubviews 中设置 scrollView 内容大小,以便它可以处理可能调整大小的 imageView。 ....我不知道,我最近一直在讨论这整个问题并接受自动布局。 :-) @AnnaDickinson 尽管我很想这样做,但滚动视图和自动布局仍然看起来很糟糕。 【参考方案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 看到实现很有帮助,即使特定语法不同,因为它是新语言。

以上是关于在代码中创建 UIScrollView 子类,在哪里添加子视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在UIScrollview中创建UIScrollview

在 iOS 7 中使用 UIScrollView 在 iOS 中创建水平滚动 UIButton

在 TabViewController 中创建 UIScrollView

如何在 C++ 中的子类中创建父对象数组?

在抽象超类的静态方法中创建子类的实例? [复制]

设置在主类的子类中创建的 PyQt5 小部件的属性