UIView动态高度取决于标签高度

时间:2016-09-09 11:41:40

标签: ios swift uiview swift2 uilabel

我有一个Label,它动态地从数据库中获取一些数据。 这些数据是字符串,有时可以是3-4-5行等。 所以这个labe在UIView里面。

--UIView
  --Label

如何让UIView获取Label动态的某个高度?

6 个答案:

答案 0 :(得分:3)

你可以用故事板这个照片来做这个

enter image description here

enter image description here

将标签高度关系设置为大于或等于

并将视图高度关系设置为大于或等于

它像魔术一样工作

答案 1 :(得分:2)

贝娄正在解决您的问题。我用了autoLayout。在testView中,您未设置heightAnchor

let testView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = UIColor.redColor()
    return view
}()

let testLabel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = "jashfklhaslkfhaslkjdhflksadhflkasdhlkasdhflkadshkfdsjh"
    return label
}()


override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(testView)
    testView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
    testView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true
    testView.widthAnchor.constraintEqualToConstant(100).active = true


    testView.addSubview(testLabel)
    testLabel.topAnchor.constraintEqualToAnchor(testView.topAnchor, constant: 10).active = true
    testLabel.leftAnchor.constraintEqualToAnchor(testView.leftAnchor, constant: 10).active = true
    testLabel.bottomAnchor.constraintEqualToAnchor(testView.bottomAnchor, constant: -10).active = true
    testLabel.rightAnchor.constraintEqualToAnchor(testView.rightAnchor, constant: -10).active = true

}

答案 2 :(得分:1)

以下代码将解决您的问题:

//调整视图高度

[yourView setFrame:CGRectMake(yourView.frame.origin.x, yourView.frame.origin.y, yourView.frame.size.width, yourLable.frame.size.height + yourLable.frame.origin.y + extraspace)];

答案 3 :(得分:1)

首先使用此函数

计算标签的大小及其包含的文本
func calculateSizeOfLabel(text:String,labelWidth:CGFloat,labelFont:UIFont)->CGSize{
        let constrainedSize = CGSizeMake(labelWidth , 9999)

        var attributesDictionary:[String:AnyObject] = [:]

            attributesDictionary = [NSFontAttributeName:labelFont] as [String:AnyObject]



        let string:NSMutableAttributedString = NSMutableAttributedString(string:text, attributes:attributesDictionary)

        var boundingRect = string.boundingRectWithSize(constrainedSize, options:.UsesLineFragmentOrigin, context:nil)

        if (boundingRect.size.width > labelWidth) {
            boundingRect = CGRectMake(0,0, labelWidth, boundingRect.size.height);
        }


    return boundingRect.size
}

然后将返回大小的高度应用于UIView,如下所示

    let labelText = description.text
    let labelWidth = description.bounds.width
    let labelFont = description.font
    let calculatedHeight = calculateSizeOfLabel(labelText,labelWidth:labelWidth,labelFont:labelFont).height 
    DescView.frame = CGRectMake(DescView.frame.origin.x, DescView.frame.origin.y, DescView.bounds.width,calculatedHeight)

答案 4 :(得分:1)

我知道这是个迟来的答案,但可能会对其他人有所帮助。

要使UIView的动态高度遵循情节提要中的简单步骤

  1. 在UIViewController中添加UIView并设置您喜欢的背景颜色

enter image description here

  1. 现在设置以下约束条件Leading,Top,Trailing和Height(截至目前)。我们可以调整Height约束以进一步实现动态高度。 enter image description here
  2. 更新高度约束,如下所示: enter image description here
  3. 现在,情节提要可能会向您显示不平等约束的歧义。但是我们现在要解决此问题。只需在UIView中添加标签,如图所示 enter image description here
  4. 现在设置标签开头,结尾,顶部和底部的约束 enter image description here
  5. Hurrah,现在UIView的高度将根据标签的高度而增加。只需对标签进行以下更改 enter image description here

此技术可与该UIView中的其他视图一起使用。问题是您必须为该UIView中存在的视图指定底部约束。

答案 5 :(得分:0)

- (IBAction)action:(id)sender {
self.label.text = @"UIImage *imageOne = [UIImage imageNamed:@RosePot.jpUIImageJPEGRepresentationg";
NSLog(@"%f",self.label.bounds.size.height);

float height = [self getHeightForText:@"UIImage *imageOne = [UIImage imageNamed:@RosePot.jpUIImageJPEGRepresentationg" withFont:[UIFont fontWithName:@"HelveticaNeue" size:15] andWidth:self.label.bounds.size.width];
NSLog(@"%f",height);
self.constraint.constant = height + self.viewOne.bounds.size.height;

}

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;

SEL selector = @selector(boundingRectWithSize:options:attributes:context:);
if ([text respondsToSelector:selector]) {
    title_size = [text boundingRectWithSize:constraint
                                    options:NSStringDrawingUsesLineFragmentOrigin
                                 attributes:@{ NSFontAttributeName : font }
                                    context:nil].size;

    totalHeight = ceil(title_size.height);
} else {
    title_size = [text sizeWithFont:font
                  constrainedToSize:constraint
                      lineBreakMode:NSLineBreakByWordWrapping];
    totalHeight = title_size.height ;
}

CGFloat height = MAX(totalHeight, 40.0f);
return height;

}

enter image description here

为视图提供前导,上限,尾随和高度约束。

视图名称的高度出口作为约束[因为我使用了出口名称约束]