动态改变视图Swift的框架

时间:2016-05-29 16:17:25

标签: ios swift uicollectionview uitextview uicollectionviewcell

enter image description here

我有UICollectionViewUICollectionViewCell包含UITextView。我想动态更改UITextView的框架。我使用以下代码。问题在于,有时这是有效的,有时它不会,并且不会对框架进行任何更改。我不确定是什么问题。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("message_cell" , forIndexPath: indexPath) as! DisplayMessageCollectionViewCell

    if let messageText =  "testing" {
        let size = CGSizeMake(250, 1000)
        let options = NSStringDrawingOptions.UsesFontLeading.union(.UsesLineFragmentOrigin)
        let estimatedFrame = NSString(string: messageText).boundingRectWithSize(size, options: options, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(14)], context: nil)

        if let user_id = NSUserDefaults.standardUserDefaults().stringForKey("userId") {
            if (user_id == "testing") {

                    cell.messageTextView.frame = CGRectMake(view.frame.width - estimatedFrame.width - 16 - 8, 0, estimatedFrame.width + 16, estimatedFrame.height + 20)

            }
            else {

                    cell.messageTextView.frame = CGRectMake(48 + 3, 0, estimatedFrame.width + 15, estimatedFrame.height + 20 )

            }
        }

    }



    return cell
}

2 个答案:

答案 0 :(得分:1)

如果您正在使用AutoLayout,只需删除文本组件的宽度和高度限制,它将根据文本大小进行调整。

接下来你应该做的是计算

中字符串的textSize
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize maximumLabelSize = CGSizeMake(yourCellWidth, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabelFont constrainedToSize:maximumLabelSize lineBreakMode: UILineBreakModeWordWrap];   
    return expectedLabelSize;
}

注意:如果您没有选中SizeClasses,它会显示黄色警告,因为您没有设置宽度和高度,只是忽略它们。

更新:您可以找到关于此主题here的好教程。

答案 1 :(得分:1)

正如Here所述,

messageTextView添加尾随和前导NSLayoutConstraints修复了问题