2013-12-09 64 views
4

我有一個自定義UITableViewCell,我試圖根據內容大小調整其中的UITextView大小。我在iOS7上並使用Autolayout。在自定義UITableViewCell中調整UITextView的大小

我使用以下嘗試:

[cell.question setScrollEnabled:YES]; 
[cell.question sizeToFit]; 
[cell.question setScrollEnabled:NO]; 

- (CGRect)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width 
{ 
    UITextView *calculationView = [[UITextView alloc] init]; 
    [calculationView setAttributedText:text]; 
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)]; 
    CGRect finalFrame = CGRectMake(0, 0, width, size.height); 
    return finalFrame; 
} 

來自不同崗位的SO。我可以調整框架大小。但問題是我無法看到明顯的變化。從某種意義上說,當我登錄時,我可以看到變化。但UITextView不會調整大小。我無法找到任何自動佈局依賴關係。

當我禁用AutoLayout時,它似乎工作。我如何做到這一點,通過啓用AutoLayout?

謝謝。

編輯

這裏是我UITextView約束

Screenshot

+0

我認爲下面的答案已經確定了單元格高度問題,但是文本視圖的約束條件在哪裏? – bilobatum

+0

我發佈的圖片。 Arent那些限制? – Anil

+0

http://stackoverflow.com/questions/18368567/uitableviewcell-with-uitextview-height-in-ios-7 – wormlxd

回答

2

你要做這個計算中

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

方法也相應調整單元格高度。

如果你明白了,沒關係。或者如果您需要代碼示例,請再次詢問。 我想你明白了!

更新

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
      UITextView *tempTV = [[UITextView alloc] init]; 
      [tempTV setText:@"your text"]; 
      CGFloat width = self.tableView.frame.size.width - TEXT_ORIGIN_X - TEXT_END_X; 
      CGSize size = [tempTV sizeThatFits:CGSizeMake(width, MAX_HEIGHT)]; 
      return (TEXT_ORIGIN_Y + size.height + TEXT_BOTTOM_SPACE); 
    } 
+0

但我應該能夠看到UITextView的大小調整了嗎? – Anil

+0

是的。我過去每天都遇到同樣的問題。解決方案是你必須在上面提到的方法中調整textview的大小,並返回行的計算高度。 –

+0

你是如何處理這種情況的? – Anil

0

你可能會忘記執行的TableView的delegete的heightForRowAtIndexPath方法;

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat yourTextViewsHeight = ... calculate it here 
    return yourTextViewsHeight; 
} 
+0

但我應該能夠看到UITextView調整大小的權利? – Anil

+0

不一定。讓我們看看你對文本視圖的限制。他們在IB嗎? – bilobatum

+0

@bilobatum請檢查編輯 – Anil

-1

試試這個

這樣設置你的UITextView出口在您的自定義的UITableViewCell類

[yourTextView setAutoresizesSubviews:YES]; 
yourTextView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

希望這會爲你

+0

這似乎沒有幫助 – Anil

+0

OP正在使用自動佈局,忘記調整大小的面具。 –

0

我想你可能有太多的約束工作文本視圖。我無法確定這一點,因爲很難傳達關於IB中構建的約束的信息。

您的文本視圖只需要兩個約束,一個用於每個軸,以便完全受到約束。一個約束應該水平放置文本視圖,另一個垂直放置。自動佈局系統將使用文本視圖的內部內容大小自動生成文本視圖的大小限制。

我認爲現在的一些限制是阻止調整文本視圖的大小。發生這種情況是因爲,默認情況下,您自己創建的約束是必需的(優先級爲1000)。另一方面,自動生成的大小限制具有較低的優先級,並且將被任何所需的衝突約束所取代。

注意:僅僅因爲文本視圖只需要兩個約束來完全約束並不意味着你不能有更多的約束。包含4個標籤,3個圖像視圖和1個文本視圖的表格單元格是一個複雜的佈局,因此您很可能會限制其他UI對象相對於文本視圖而不是超級視圖。

0
I had the same issue but in a different situation. I have UItableview with two custom cells. 

First Custom cell - self expanding textview. (like email type message box) 
Second Custom Cell - Static image. 

Have a look at my code. You will get an insight to automatic resizing of cells. 

// ViewController.swift 
// ListWrap 

import UIKit 

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, UITextViewDelegate { 

    @IBOutlet var listWrapTableView: UITableView! 

    //CustomCells 
    var CellIdentifier: String = "ListWrapTableViewCellID" 
    var tapGesture: UITapGestureRecognizer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
    override func viewWillAppear(animated: Bool) { 
     //Adding Tap Gesture To Table 
     tapGesture = UITapGestureRecognizer(target: self, action: "tapRecognized:") 
     self.listWrapTableView.addGestureRecognizer(tapGesture) 
     tapGesture.cancelsTouchesInView = false 
     tapGesture.enabled = true 
    } 
    func tapRecognized(recognizer: UITapGestureRecognizer){ 
     self.listWrapTableView.endEditing(true) 
    } 
    func textViewDidBeginEditing(textView: UITextView) { 
     if (CellIdentifier == "ListWrapTableViewCellID") 
     { 
      tapGesture.enabled = true 
     } 
     else 
     { 
      tapGesture.enabled = false 
     } 
    } 
    // MARK: - Table view data source 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 
    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    { 
     self.listWrapTableView.rowHeight = UITableViewAutomaticDimension 
     return self.listWrapTableView.rowHeight 
    } 
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return UITableViewAutomaticDimension 
    } 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 2 
    } 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     if (indexPath.row == 0) 
     { 
      let surveyCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! ListWrapTableViewCell 
      return surveyCell 
     } 
     else if (indexPath.row == 1) 
     { 
      let reportsCell = tableView.dequeueReusableCellWithIdentifier("ListWrapSecondTableViewCellID")! as! ListWrapSecondTableViewCell 
      return reportsCell 
     } 
     else 
     { 
      let cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "") 
      return cell 
     } 
    } 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
    } 
} 



The first Custom cell: 

// ListWrapTableViewCell.swift 
// ListWrap 

import UIKit 

class ListWrapTableViewCell: UITableViewCell{ 

    @IBOutlet var listWrapTextView: UITextView! 

// 
// override init?(style: UITableViewCellStyle, reuseIdentifier: String!) { 
//  super.init(style: style, reuseIdentifier: reuseIdentifier) 
// } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 

    /// Custom setter so we can initialise the height of the text view 
    var textString: String { 
     get { 
      return listWrapTextView.text 
     } 
     set { 
      listWrapTextView.text = newValue 
      textViewDidChange(listWrapTextView) 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     listWrapTextView.scrollEnabled = false 
     listWrapTextView.delegate = self 
    } 
    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     if selected { 
      listWrapTextView.becomeFirstResponder() 
     } else { 
      listWrapTextView.resignFirstResponder() 
     } 
    } 
} 
extension ListWrapTableViewCell: UITextViewDelegate { 
    func textViewDidChange(textView: UITextView) { 

     let size = textView.bounds.size 
     let newSize = textView.sizeThatFits(CGSize(width: size.width, height: CGFloat.max)) 

     // Resize the cell only when cell's size is changed 
     if size.height != newSize.height { 
      UIView.setAnimationsEnabled(false) 
      tableView?.beginUpdates() 
      tableView?.endUpdates() 
      UIView.setAnimationsEnabled(true) 

      if let thisIndexPath = tableView?.indexPathForCell(self) { 
       tableView?.scrollToRowAtIndexPath(thisIndexPath, atScrollPosition: .Bottom, animated: false) 
      } 
     } 
    } 
} 
extension UITableViewCell { 
    /// Search up the view hierarchy of the table view cell to find the containing table view 
    var tableView: UITableView? { 
     get { 
      var table: UIView? = superview 
      while !(table is UITableView) && table != nil { 
       table = table?.superview 
      } 

      return table as? UITableView 
     } 
    } 
} 

The second custom cell: 

// ListWrapSecondTableViewCell.swift 
// ListWrap 


import UIKit 

class ListWrapSecondTableViewCell: UITableViewCell { 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 
    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 

} 


attaching storyBoard for further reference. 

enter image description here

0

你的佈局更加複雜一點,但如果一切設置正確,它不應該的問題。

您不必計算任何東西(通過使用sizeThatFits)。

您只需禁用UITextView的滾動啓用屬性,然後在textViewDidChange上調用tableView.beginUpdates()和tableView.endUpdates()即可。這不會中斷第一響應者,並順利調整表視圖的大小。

有關詳細說明,請查看post I wrote,其中還包含一個工作示例項目。

相關問題