如何在UIView中设置UILabel上下排列?3个标签位置设置异常求助
解决三个UILabel上下排列的Frame布局问题
嘿,这个问题我太熟悉了!你踩了一个用frame布局时超常见的小坑~
问题原因
你设置label3的y坐标时,只用到了label2.frame.size.height,但实际上label2本身的y坐标已经是label1的高度了(也就是label1.frame.size.height)。所以label3的正确y坐标应该是**label2的y坐标 + label2的高度**,这样它才会紧跟在label2的下方,而不是回到父视图的顶部附近。
修正后的Frame代码
直接调整label3的y坐标计算方式就行,这里推荐两种写法:
写法1:手动计算y坐标
// 假设Width和Height是你预先定义好的常量/变量 label1.frame = CGRectMake(0, 0, Width, Height); label2.frame = CGRectMake(0, label1.frame.origin.y + label1.frame.size.height, Width, Height); // 这里其实你之前的写法也对,但这样写更通用 label3.frame = CGRectMake(0, label2.frame.origin.y + label2.frame.size.height, Width, Height); // *核心修正处*
写法2:用系统函数简化计算
苹果提供了CGRectGetMaxY()函数,可以直接获取控件底部的y坐标,代码更简洁不易出错:
label1.frame = CGRectMake(0, 0, Width, Height); label2.frame = CGRectMake(0, CGRectGetMaxY(label1.frame), Width, Height); label3.frame = CGRectMake(0, CGRectGetMaxY(label2.frame), Width, Height);
更推荐的方案:Auto Layout
如果你的项目支持iOS 9及以上,真心建议用Auto Layout来做布局——frame布局在屏幕旋转、label文字换行(高度变化)等场景下很容易失效,Auto Layout能自动适配这些情况。这里给你一个用锚点布局的示例:
// 先关闭系统自动生成的约束 label1.translatesAutoresizingMaskIntoConstraints = NO; label2.translatesAutoresizingMaskIntoConstraints = NO; label3.translatesAutoresizingMaskIntoConstraints = NO; // 把三个label添加到父视图 [self.view addSubview:label1]; [self.view addSubview:label2]; [self.view addSubview:label3]; // 激活约束 NSLayoutConstraint.activate(@[ // label1的约束:左对齐父视图、顶部贴父视图、固定宽高 label1.leadingAnchor.constraintEqualToAnchor:self.view.leadingAnchor, label1.topAnchor.constraintEqualToAnchor:self.view.topAnchor, label1.widthAnchor.constraintEqualToConstant:Width, label1.heightAnchor.constraintEqualToConstant:Height, // label2的约束:左对齐label1、顶部贴label1底部、宽高和label1一致 label2.leadingAnchor.constraintEqualToAnchor:label1.leadingAnchor, label2.topAnchor.constraintEqualToAnchor:label1.bottomAnchor, label2.widthAnchor.constraintEqualToAnchor:label1.widthAnchor, label2.heightAnchor.constraintEqualToAnchor:label1.heightAnchor, // label3的约束:左对齐label2、顶部贴label2底部、宽高和label2一致 label3.leadingAnchor.constraintEqualToAnchor:label2.leadingAnchor, label3.topAnchor.constraintEqualToAnchor:label2.bottomAnchor, label3.widthAnchor.constraintEqualToAnchor:label2.widthAnchor, label3.heightAnchor.constraintEqualToAnchor:label2.heightAnchor ]);
内容的提问来源于stack exchange,提问作者Test 87
相关产品推荐
相关产品推荐

