Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableViewCells initial load view/display issue

So I've got a UITableView loading up many columns of quotes. Upon entering the UITableView that displays this data, the cells seem to initially not be loading properly and the text looks really squished and/or cut off, after about a 1/2 second, it loads properly and everything works fine.

This occurs every time I load up the table view.

For example:

enter image description here

Is this a problem with the .estimatedrowheight...or is it because the view cannot load the data into theUITableView` fast enough? I've tried modifying the row height to no avail however.

Edit

It looks like when I explicity set the height like this -

captionsTableView.rowHeight = 80

it works just fine...as in the cells load at 80points in height each, without the initial loading glitch.

But using captionsTableView.rowHeight = UITableViewAutomaticDimension and captionsTableView.estimatedRowHeight = 80.0 breaks it

Edit 2 - code

class CaptionsController: UIViewController, UITableViewDelegate, UITableViewDataSource  {

  @IBOutlet weak var captionSegment: UISegmentedControl!
  @IBOutlet weak var captionText: UINavigationItem!
  @IBOutlet weak var captionSearchBar: UISearchBar!
  @IBOutlet weak var captionsTitle: UILabel!
  var receiveImage:UIImage!
  //var receiveCategoryText:String!
  //var firstNameCell: UITableViewCell = UITableViewCell()
  //var firstNameText: UITextField = UITextField()
  var model:ModelData!
  let tapRec = UITapGestureRecognizer()
  var currentCell: UITableViewCell!
  var fav: String!
  let basicCellIdentifier = "CustomCells"
  @IBOutlet weak var captionsTableView: UITableView!
  var c: CustomCells!
  var captionJSON: JSON = nil

  override func viewDidLoad() {
    super.viewDidLoad()
    model = (self.tabBarController as CaptionTabBarController).model
    captionJSON = model.quoteSelection()
    captionText.title = model.categoryName
    captionsTableView.delegate = self
    captionsTableView.dataSource = self
    self.navigationController?.navigationBar.titleTextAttributes = [ NSFontAttributeName: UIFont(name: "CherrySwash-Regular", size: 25)!,  NSForegroundColorAttributeName: UIColor(red:0.0/255.0, green: 159.0/255.0, blue: 172.0/255.0, alpha: 1.0)]
    configureTableView()
    captionsTableView.reloadData()
    tapRec.numberOfTapsRequired = 2
    tapRec.addTarget(self, action: "tappedView")
    self.view.addGestureRecognizer(tapRec)
    self.view.userInteractionEnabled = true
  }

  func configureTableView() {
    captionsTableView.rowHeight = UITableViewAutomaticDimension
    captionsTableView.estimatedRowHeight = 80.0
  }

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    //deselectAllRows()
    //captionsTableView.reloadData()
  }

  override func viewDidAppear(animated: Bool) {
    captionsTableView.reloadData()
  }

  func deselectAllRows() {
    if let selectedRows = captionsTableView.indexPathsForSelectedRows() as? [NSIndexPath] {
      for indexPath in selectedRows {
        captionsTableView.deselectRowAtIndexPath(indexPath, animated: false)
      }
    }
  }

  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return captionJSON.count
  }

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return customCellAtIndexPath(indexPath)
  }

  func customCellAtIndexPath(indexPath:NSIndexPath) -> CustomCells {
    var cell = captionsTableView.dequeueReusableCellWithIdentifier(basicCellIdentifier) as CustomCells
    setTitleForCell(cell, indexPath: indexPath)
    setSubtitleForCell(cell, indexPath: indexPath)
    setImageForCell(cell, indexPath: indexPath)
    return cell
  }

  func setTitleForCell(cell:CustomCells, indexPath:NSIndexPath) {
    let item = captionJSON[indexPath.row]["quote"] 
    cell.mainLabel.text = item.stringValue
  }

  func setSubtitleForCell(cell:CustomCells, indexPath:NSIndexPath) {
    let item = captionJSON[indexPath.row]["author"]
    cell.creditLabel.text = item.stringValue
  }

  func setImageForCell(cell:CustomCells, indexPath:NSIndexPath) {
    //let item = Array(Array(model.quoteItems.values)[indexPath.row])[1] as? String
    //if (item == "fav") {
      //cell.favImgView.image = UIImage(named: "icon-heart-fav")!
    //} else {
      cell.favImgView.image = UIImage(named: "icon-heart")!
    //}
  }

  func tappedView(){
    //need to add filled icon, as well as logic to not change image upon select of favorited cell
    var image : UIImage = UIImage(named: "icon-heart-fav")!
    c.favImgView.image = image
  }

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    c = captionsTableView.cellForRowAtIndexPath(indexPath) as CustomCells
    var captiontabBar:CaptionTabBarController = CaptionTabBarController()
    model.quote = c.mainLabel.text!
    model.author = c.creditLabel.text!

    println(" quote!!! " + model.quote)

    self.tabBarController?.selectedIndex = 0

    //let secondViewController:SelectionsController = SelectionsController()

    //self.presentViewController(secondViewController, animated: true, completion: nil)

    //let returnController = self.storyboard!.instantiateViewControllerWithIdentifier("selections") as? UIViewController
    //self.presentViewController(returnController!, animated: true, completion: nil)


    /*for tempCell: UITableViewCell in tableView.visibleCells() as [UITableViewCell] {
      var image : UIImage = UIImage(named: "icon-heart")!
      tempCell.imageView?.image = image
    }

    var image : UIImage = UIImage(named: "icon-heart-overview")!
    c.favImgView?.image = image*/
  }

}

class CustomCells: UITableViewCell {
  @IBOutlet var mainLabel: UILabel!
  @IBOutlet var creditLabel: UILabel!
  @IBOutlet var favImgView: UIImageView!
}
like image 488
zillaofthegods Avatar asked Feb 22 '26 14:02

zillaofthegods


1 Answers

Add your code in (void)viewWillAppear:

Looks like you are doing it in viewDidload.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (![self.p_tableView respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)])
    {
        self.p_tableView.rowHeight = UITableViewAutomaticDimension;
        self.p_tableView.estimatedRowHeight = 100.0f;
    }
}
like image 127
Sam B Avatar answered Feb 25 '26 02:02

Sam B



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!