如何将一个 UIView 添加到底部的另一个 UIView

Posted

技术标签:

【中文标题】如何将一个 UIView 添加到底部的另一个 UIView【英文标题】:How to add a UIView into another UIView at the bottom 【发布时间】:2018-01-07 23:15:36 【问题描述】:

如何将 UIView 插入到 UILabel 中?

目标:

将一个单独的 UIView 作为现有 UI 组件的背景。

示例

    //Views
    let viewOne = UIImageView(); //bottom view, e.g. a UIImageView
    let viewTwo = UILabel();     //top view, e.g. a UILabel

    //Traditional
    self.addSubview(viewOne);
    self.addSubview(viewTwo);   //viewTwo goes on top 

    //Target
    viewTwo.addSubview(viewOne);
    self.addSubview(viewTwo;    //goal is to encapsulate viewOne into viewTwo

问题

如何将 viewOne 插入 viewTwo 的底部?是不是用了一层viewOne,我好像搞不定这个成功!

【问题讨论】:

使用合适的初始化器来接收一个帧。根据需要添加约束。 嘿?我特别想将图像和背景颜色应用于 UILabel,您的答案不适用于这里吗? 我的评论当然适用。使用正确的初始化程序创建视图会有所帮助。并且使用约束还可以正确调整视图的大小和位置。 rmaddy 我不明白您在这里的参考,请参阅下面我发布的解决方案,以说明我如何使用 Adam 的建议完成 UIView 集成。请进一步详细说明,以便我们更好地了解您的意图。 【参考方案1】:

作为一般规则,如果可以避免,您不应该以未记录或意外的方式使用 UIKit 类。在这种情况下,您不知道 UILabel 是否需要一组特定的子视图,或者它是否取决于这些子视图的顺序。

这样做的正确方法是创建新的UIView 子类,其中包含两个视图作为它自己的 子视图。这样,您可以控制视图顺序、位置等,而不必担心UILabel 内部结构将来会发生怎样的变化。

【讨论】:

【参考方案2】:

谢谢亚当,我用这个来解决问题。以下是我的解决方案供参考:

class TexturedLabel :  NSObject 
    var label     : UILabel;
    var imageView : UIImageView;

    override init() 
        label     = UILabel();
        imageView = UIImageView();
        super.init();
        imageView.image = UIImage(named:"textured");  /* grab texture img                                   */
        imageView.contentMode = .topLeft;             /* place the image in the upper left corner unscaled  */
        imageView.clipsToBounds = true;               /* constrain image to frame boundaries                */
    

    func text(_ text:String)                             label.text = text; 
    func font(_ font:UIFont?)                            label.font = font; 
    func color(_ color:UIColor)                          imageView.backgroundColor = color;
    func frame(_ frame:CGRect)                           label.frame = frame; imageView.frame = frame;     
    func textColor(_ textColor:UIColor)                  label.textColor = textColor; 
    func textAlignment(_ textAlignment:NSTextAlignment)  label.textAlignment = textAlignment; 
    func numberOfLines(_ numberOfLines:Int)              label.numberOfLines = numberOfLines; 
    func lineBreakMode(_ lineBreakMode:NSLineBreakMode)  label.lineBreakMode = lineBreakMode; 

    func addToView(_ view : UIView) 
        view.addSubview(self.imageView);
        view.addSubview(self.label);
    

非常感谢亚当!!

【讨论】:

以上是关于如何将一个 UIView 添加到底部的另一个 UIView的主要内容,如果未能解决你的问题,请参考以下文章

将视图添加到底部的垂直线性布局(以编程方式)

更改到某个部分内的另一个视图

将 UIView 添加到横向窗口

将 UILabel 的层添加到另一个层(单独的 UIView)

以编程方式向 UIView 添加约束

iOs - 将uiview插入代码中的另一个视图,保持约束