在代码中创建 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
子类不能自动由其他子 UIView
s 组成,这似乎很奇怪,尤其是当它很容易使用 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