Swift:故事板中可重用的 UIView 和大小限制

问题描述 投票:0回答:3

我正在尝试在 Swift 中创建一个可重用的 UIView,我可以将其插入到 Storyboard 视图控制器中。我现在的关键问题是可重用的 UIView“小部件”并不完全适合故事板中的 UIView 框。我按照本教程设置了可重用的 UIView 小部件

  1. 创建了 UIView 的子类和相应的 .xib - 并将它们连接起来:

    import UIKit
    
    class MyWidgetView: UIView {
    
    @IBOutlet var view: UIView!;
    
    required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder);
    
    NSBundle.mainBundle().loadNibNamed("MyWidgetView", owner: self, options: nil);
    self.addSubview(self.view);
    }
    
    }
    
  2. 在XIB中,即上面代码对应的界面文件,我在Simulated Metrics下使用了Freeform尺寸的UIView,在View模式下使用了Scale to Fill。

  3. 在主故事板中,我添加了一个 UIView 块(相同的矩形形状)并将类更改为 MyWidgetView

  4. 它可以工作,但我在 XIB 中创建的组件在实际应用程序中看起来被压扁了,尽管我在 XIB 和主故事板中都使用了布局约束。

请参阅屏幕截图。粉色部分不应该出现,因为这只是我为了测试尺寸而添加的主故事板上 UIVIew 的颜色。该 UIView 实际上是 MyWidgetView (在我在步骤 3 中更改类之后。所以理论上,由于 MyWidgetView == 主情节提要上的 UIView,并且该 UIView 具有使其在超级视图中成为矩形的约束,那么为什么我的小部件会被压扁?下面的蓝色部分应该一直向右延伸。 Squished widget 从代码中的 nib 文件加载的实际视图层次结构是通过添加的

self.addSubview(self.view)
swift uiview autolayout
3个回答
15
投票
self.view

的框架实际上与其父级(即

MyWidgetView
)没有任何关系。
您可以选择通过代码添加布局约束,也可以选择在添加为子视图后仅设置其框架。就我个人而言,我更喜欢后者。在我的实验中,以下内容对我有用。我使用的是 Xcode 6.4,我认为它与你的不一样。
required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    if let nibsView = NSBundle.mainBundle().loadNibNamed("MyWidgetView", owner: self, options: nil) as? [UIView] {
        let nibRoot = nibsView[0]
        self.addSubview(nibRoot)
        nibRoot.frame = self.bounds
    }
}

或者可以覆盖可变框架。当 CardImgText 设置为视图的文件所有者时,此代码对我有用。 

1
投票

如果您对效率比实时更新更感兴趣。然后替换:

    override var frame: NSRect{
        didSet{
            view.frame = bounds
        }
    }

与:

override func viewDidEndLiveResize() {
    view.frame = bounds
}

设置笔尖框架后设置约束。确保 xib 的父 uiview 中有一个内容视图。然后您在 contentView 中添加您自己的视图。下面的代码对我有用。

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.