UITableView strange layout behavior changes on scroll

前端 未结 2 1961
予麋鹿
予麋鹿 2020-12-07 02:22

I have a UITableView with custom UITableViewCell designed to have automatic height.

The behavior is that in the first load of my UIVi

相关标签:
2条回答
  • 2020-12-07 03:16

    Getting auto layout to work on a UITableViewCell is to ensure you have constraints to pin each subview on all sides — that is, each subview should have leading, top, trailing and bottom constraints.

    Furthermore, you need a clear line of constraints going from the top to the bottom of the contentView. This ensures that auto layout correctly determines the height of the contentView based on its subviews.

    The tricky part is that Interface Builder often won’t warn you if you’re missing some of these constraints; auto layout simply doesn’t return the correct heights when you run the project. For example, it may return 0 for the cell height, which is a clue that your constraints need more work.

    If you run into issues when working with your own projects, try adjusting your constraints until the above criteria are met.

    check the link for details:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift

    0 讨论(0)
  • 2020-12-07 03:19

    I think you can use heightForRowAtIndexPath method

     override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    
        var heightToReturn : CGFloat = 0
    
        heightToReturn = StringUtil.findHeightForText("your text", havingWidth: "your label width" , andFont: UIFont.systemFontOfSize("font size"))  + // add some buffer for padding
    
        if heightToReturn < 101
        {
            heightToReturn = 101
        }
        return heightToReturn
        }
    
    }
    

    and use this method to calculate the height of the text

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
    CGFloat result = font.pointSize+4;
    if (text) {
        CGSize size;
    
        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    
    return result;
    

    }

    0 讨论(0)
提交回复
热议问题