来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

Posted

技术标签:

【中文标题】来自 XIB 的自定义 UIView 加载具有巨大规模的子视图【英文标题】:Custom UIView from XIB loading with huge scale for subviews 【发布时间】:2016-02-18 19:32:00 【问题描述】:

我遇到了自定义 UIView 实现的问题。我想要做的是为 UICollectionViewCell 设置动画,并在单元格缩放和“翻转”后创建一个新视图。 (将 UICollectionViewCells 视为卡片)。

我成功地实现了所需的动画。但是,当我在 XIB 文件的代码中创建视图时,似乎应用了约束,但一切都被放大了。我将标签的最小字体比例设置为 0.2,但它似乎不起作用。

这是在 IB 中设计的视图:

View designed in IB with constraints

现在,当动画继续向单元格视图添加新的 CardBackView 时,我得到了以下结果:

The horrendous result

这是执行动画并添加卡片后视图的代码:

// now flip card and show other side of card
            UIView.transitionWithView(cell, duration: duration, options: [.BeginFromCurrentState, .TransitionFlipFromRight, .CurveEaseInOut], animations:  () -> Void in

                let cardBackView = NSBundle.mainBundle().loadNibNamed("CardBackView", owner: self, options: nil).first as! CardBackView
                cardBackView.frame = cell.bounds
                cardBackView.titleLabel.text = movie.title
                cardBackView.titleLabel.textColor = UIColor.whiteColor()
                cardBackView.overviewLabel.text = movie.overview
                cardBackView.backgroundColor = UISettings.TabBarColor
                cell.addSubview(cardBackView)

                , completion: nil)

【问题讨论】:

【参考方案1】:

当您将 CardBackView 添加到 Cell 时,它假定您将自动调整大小的掩码转换为约束,因此它的行为可能会很奇怪。要解决此问题,您需要为 CardBackView 创建约束并将它们添加到您的 Cell(它是父级)。

如果您的 CardBackView 应该使用与您的 Cell 相同的大小,那么这样的事情应该可以工作:

cardBackView.translatesAutoresizingMaskIntoConstraints = false
cell.addConstraint(NSLayoutConstraint(item: cardBackView, attribute: .Top, relatedBy: .Equal, toItem: cell, attribute: .Top, multiplier: 1, constant: 0))
cell.addConstraint(NSLayoutConstraint(item: cardBackView, attribute: .Bottom, relatedBy: .Equal, toItem: cell, attribute: .Bottom, multiplier: 1, constant: 0))
cell.addConstraint(NSLayoutConstraint(item: cardBackView, attribute: .Left, relatedBy: .Equal, toItem: cell, attribute: .Left, multiplier: 1, constant: 0))
cell.addConstraint(NSLayoutConstraint(item: cardBackView, attribute: .Right, relatedBy: .Equal, toItem: cell, attribute: .Right, multiplier: 1, constant: 0))

【讨论】:

以上是关于来自 XIB 的自定义 UIView 加载具有巨大规模的子视图的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 XIB 的自定义 NSView/UIView 子类?

如何响应从 xib 加载的自定义视图中发生的操作?

如何使自动布局与 XIB 中的自定义 UIView 一起使用?

从 .xib 加载自定义视图不适合 iPhone 6+

使用自定义 uiview xib

从 Textfield.inputview 加载 xib UIView