Swift:以编程方式附加自定义 UIView

Posted

技术标签:

【中文标题】Swift:以编程方式附加自定义 UIView【英文标题】:Swift: Append Custom UIView programmatically 【发布时间】:2015-07-17 06:42:39 【问题描述】:

这是另一个SO question 的 副本,但是我遇到了一些问题,它看起来好像我没有正确执行。作为参考,我从一个自定义类和 xib 文件中遵循了这个excellent tutorial on creating re-usable views(它只有几分钟:),我完全没有问题将它拖到我的故事板的另一个视图中(如视频末尾所示)

尽管如此,就我而言 — 我正在尝试以编程方式调用我的自定义类,并将其作为子视图添加到我的 ScrollView 实例之一。

class MainController: UIViewController 

    @IBOutlet weak var scrollView: UIScrollView!
    override func viewDidLoad() 
        super.viewDidLoad()
    
    override func viewDidAppear(animated: Bool) 
        super.viewDidAppear(animated)
        first.directionalLockEnabled = true
        first.pagingEnabled = true
        var item = MyCustomView(frame: CGRectMake(0, 0, self.view.frame.width, 200))
        self.scrollView.addSubview(item)
    


我的自定义视图如下所示:

import UIKit

class MyCustomView: UIView 
    @IBOutlet var view: UIView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var dressTitle: UILabel!
    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        NSBundle.mainBundle().loadNibNamed("MyCustomView", owner: self, options: nil)
        self.view.frame = bounds
        self.addSubview(self.view)
    
    override init(frame: CGRect) 
        super.init(frame: frame)

    

还有一个与之关联的.xib 文件,其中包含标签和图像。

所以我的问题是,我的视图永远不会出现在我的 ScrollView 中。我已经仔细检查了滚动视图上的约束...我什至可以附加简单的UIView 带有明显可见尺寸CGRectMake(0, 0, 100, 100)...而且什么都没有给出。我错过了什么?

【问题讨论】:

你能打印更多关于 viewDidAppear 的信息吗?比如 self.view.frame 和 self.scrollView.frame 还有 self.scrollView.subViews.count customView = MyCustomView(frame: CGRectZero(top: 0, left: 0, width: 200, height: 50) 试试这样 是的,我也试过这些以防万一:)。我的主要self.view.frame(0.0, 0.0, 320.0, 568.0)self.scrollView.frame(0.0, 11.0, 320.0, 200.0) @ded 检查这个:youtube.com/watch?v=o3MawJVxTgk @AshishKakkad 如果您不介意,请仔细阅读我的问题 - 我已经在原始问题中引用了该确切视频作为我遵循的教程。 【参考方案1】:

由于有些混乱,我不小心通过将loadFromNib 方法复制到CustomView.swift 文件中的第二个初始化程序来使其工作。正如在原始问题中发布的视频教程中看到的那样,它只显示了一个初始化程序......但在我的情况下,我必须向init(frame) 添加额外的代码。例如:

// once with a NSCoder
required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    NSBundle.mainBundle().loadNibNamed("Item", owner: self, options: nil)
    self.view.frame = bounds
    self.addSubview(self.view)


// for this to work programmatically I had to do the same...
override init(frame: CGRect) 
    super.init(frame: frame)
    NSBundle.mainBundle().loadNibNamed("Item", owner: self, options: nil)
    self.view.frame = bounds
    self.addSubview(self.view)

【讨论】:

以上是关于Swift:以编程方式附加自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

xcode - 将 xib 文件附加到自定义 UIView 类时出错

如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图

如何在 Swift 1.2 中初始化自定义 UIView

如何使用 Swift 以编程方式添加约束

在 xib 中以编程方式自定义 UIView