iOS9:在另一个以编程方式添加的视图中居中以编程方式添加的视图

Posted

技术标签:

【中文标题】iOS9:在另一个以编程方式添加的视图中居中以编程方式添加的视图【英文标题】:iOS9: Centering programmatically added view inside another programmatically added view 【发布时间】:2015-12-09 15:39:19 【问题描述】:

我有一个水平堆栈视图。我以编程方式将 UIViews 添加到 stackview 中。添加的 UIView 还包含第三个视图,即 UIImageView。 UIImageView 以编程方式缩放到更小的尺寸(高度 = 宽度 = StackView 的高度)。

我想将 UIImageView 放在 UIView 的中心。但是在将 UIImageView 添加到 UIView 之后,UIView 没有分配任何大小,我无法弄清楚如何正确居中。

我尝试添加灵活边距并测试了一些约束。

我还有什么其他选择?

let wrapView = UIView()
let image = images[i]
let imageView = UIImageView(image: image)

imageView.contentMode = .ScaleAspectFit

wrapView.addSubview(imageView)
miniPicturesView.addArrangedSubview(wrapView)

图像相关:蓝色方块应位于矩形的中心。 正方形是 UIImageView,矩形是 UIView。三个 UIView 位于一个水平的 stackview 中。

【问题讨论】:

【参考方案1】:

我确信您可以使用自动布局来做一些事情,但是当您有一个需要在其中定位的子视图的视图时,我认为子类化 UIView 是一种更好的方法。 (这两种方法不是唯一的,如果需要,您可以在子类中使用自动布局)

您的包装视图可能是以下 CenterView 类的实例:

class CenterView : UIView

    var subView: UIView

    init (fromUIView view: UIView)
    
        self.subView = view;
        super.init(frame: CGRect(x: 0,y: 0,width: 0,height: 0));
        self.addSubview(self.subView);
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func layoutSubviews()
    
        self.subView.center = CGPoint(x: self.bounds.width / 2, y: self.bounds.height / 2)
    

通过将 UIImageView 传递给构造函数来构造 CenterView 后,它将保持 UIImageView 居中。

【讨论】:

这确实是我出于某种原因试图避免的一个聪明的解决方案。我想在 ios 中子类化视图并不是那么糟糕。 子类化无处不在,对于 UIView.. :) class UILabel : UIView -- UIButton : UIControl -- UIControl : UIView ....

以上是关于iOS9:在另一个以编程方式添加的视图中居中以编程方式添加的视图的主要内容,如果未能解决你的问题,请参考以下文章

在另一个以编程方式创建的视图下方布局视图

以编程方式将 XIB 视图添加到具有边界的视图控制器 - 不居中

在 iOS 8 中以编程方式将视图中的按钮居中使用约束

斯威夫特 3 |以编程方式添加约束不会使我的子视图居中

是否可以以编程方式强制 iOS 应用程序在拆分视图/滑动中在 ios9 中全屏显示?

嵌入 UIViewController 比向 UIViewController 添加子视图更好(以编程方式)