XCode: Labels on top of image disappearing in custom table cell - ios

I have a custom table cell where two labels are on top of an image, though are not appearing when I run the app in the simulator. When I comment out the image, I see the labels just fine.
I have auto-layout set, pinning the image to the top, bottom, left, and right of the super view. I also have the labels pinned to left and right edges of the superview, and vertical spacing between them and the bottom edge of the superview to the bottom label.
If the image is included, however, I don't see the labels at all. I'm sure they're above (i.e. they come after) the image in the scene explorer at the left.
Any ideas? Here's what the custom cell looks like:
I've tried deleting all constraints, running without using Auto-layout at all, re-adding constraints several times... nothing seems to work.
My UITableView class is as follows:
class CustomCell: UITableViewCell {
#IBOutlet weak var name: UILabel!
#IBOutlet weak var location: UILabel!
#IBOutlet weak var cardImage: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func setProperty (name: String, location: String, cardImageName: String) {
self.name.text = name
self.location.text = location
self.cardImage.image = UIImage(named: cardImageName)
}
}
I've also done println in the cellForRowAtIndexPath function, and the name and location are populating properly from the array... which I already knew, as they populate properly when the image is commented out. Maddening!
Here's how the labels and image are stacked:
Thanks in advance for any help!

Related

Swift: stop image inside scroll from moving up and down

I am working on a sample to display images inside scroll. The image is loading fine but then it allows me to drag the image up and down inside the scroll. I would still want to be able to move right and left (horizontally), but the image should be fixed from moving vertically.
The scroll view and the image constraints are set to the top, bottom, left and right as those of the main view.
What am I doing wrong?
This is my code and storyboard settings
import UIKit
class Image2ViewController: UIViewController, UIScrollViewDelegate {
#IBOutlet weak var scrollView: UIScrollView!
#IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.scrollView.contentSize = (imageView.image?.size)!
}
}
and these are my storyboard settings for ScrollView and ImageView. The top 2 are for the scroll and other 2 are for the image.
Adding this line in the viewDidload solved the issue:
self.automaticallyAdjustsScrollViewInsets = false

Some Cells on UITableView won't auto-resize

I am experiencing a very strange phenomenon. I am using the AutomaticDimension function on my tableview and for some odd reason it works on all of my cells except for 3. All of my cells have the exact same constraints which is the weird part. I have tried changing the constraints on the cells but it appears that they are being ignored. Any insight would be great. I make sure to call the auto dimension function in viewdidload.
override func viewDidLoad() {
super.viewDidLoad()
self.TableView.dataSource = self
TableView.estimatedRowHeight = 200.0
TableView.rowHeight = UITableViewAutomaticDimension
}
Here is one of the classes that is not working:
class foursleepCell: UITableViewCell {
#IBOutlet weak var foursleepLabel: UILabel!
#IBOutlet weak var foursleepScale: UISegmentedControl!
var delegate: foursleepCellToController?
#IBAction func foursleepValueChanged(_ sender: UISegmentedControl) {
if let delegate = delegate {
let indexPath = delegate.indexOfChangedfoursleepCell(at: self)
delegate.savefoursleepCellResponse(at: indexPath, response: foursleepScale.selectedSegmentIndex)
}
}
}
Attached are images of constraints and output:
Label Constraints
Segmented Control Constraints
Actual Output
Working Output
I don't think there is anything wrong with the way you are trying to set the cell to automatically resize, it is just the fact the the top-to-bottom constraints that are required for that resizing to happen are not present at runtime. Apparently this is something that can happen sometimes in Xcode - try creating a new table view cell and setting up all the views and constraints again from scratch. Copying and pasting the table view cell into a new cell and working from the copy did not fix it for me - it behaved exactly the same. But setting it up fresh did the trick.

Why do the child widgets of my custom UITableViewCell stack on top of each other?

I have a custom UITableViewCell that I've designed in a storyboard. The custom cell contains a label and a text field. The label should be on the left side of the cell and the text field should be on the right side. But no matter what combination of constraints I try (constraining the right side of the text field to the right side of the cell, spacing the left side of the text field 300 pixels from the label, etc...) the text field always ends up stacked on the label when I run my app.
Here's a screenshot of a portion of the storyboard
In this image, the trailing edge of the text field is set to the trailing margin of its parent.
This is what it looks like in the app.
This is my code for the custom table cell class:
class ItemRowCell: UITableViewCell {
#IBOutlet weak var itemDescription: UILabel!
#IBOutlet weak var quantity: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
You've set something incorrectly... I suggest, start fresh.
Delete the current Label and Text Field.
Add a new label to your cell prototype, and set the Leading Constraint to 0 and the Vertical Constraint to Centered - should look like this:
Add a new Text Field, and set the Trailing Constraint to 0, the Vertical Constraint to Centered, and the Width Constraint to 80:
Re-connect your #IBOutlets, and run the app.

Change Swift constraint on if statement

Here is my tableview row/cell:
there are constraints set in place - the imageview is below the label and the button is below the imageview.
here is my code:
if(row == 1) {
imageview.hidden = false
} else {
imageview.hidden = true
//how can i change the button constraint from below imageview to below label?
Adding and removing constraints is really bad example for that. I'll make your UI more complex.
Best way of solving these auto-layout problems is adding two constraints. One from imageView to button and second from imageView to label.
Now after setting these constraints, you need to set their priority levels. So, let's say button will be below the imageView first. In this case, you need to set imageView to button constraint's priority to something like 750 or UILayoutPriorityDefaultHigh and label to button constraint's priority to 250 or UILayoutPriorityDefaultLow.
Let's start creating a custom UITableViewCell
class YourTableViewCell: UITableViewCell {
#IBOutlet weak var imageView: UIImageView!
#IBOutlet weak var label: UILabel!
#IBOutlet weak var button: UIButton!
#IBOutlet weak var buttonToLabelConstraint: NSLayoutConstraint!
#IBOutlet weak var buttonToImageViewConstraint: NSLayoutConstraint!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func shouldHideImageView(hidden: Bool) {
if(hidden == false) {
buttonToLabelConstraint.priority = UILayoutPriorityDefaultLow
buttonToImageViewConstraint.priority = UILayoutPriorityDefaultHigh
imageView.hidden = true
} else {
buttonToLabelConstraint.priority = UILayoutPriorityDefaultHigh
buttonToImageViewConstraint.priority = UILayoutPriorityDefaultLow
imageView.hidden = false
}
self.contentView.layoutIfNeeded()
}
}
After that, in your class where tableView is placed implement a logic like that:
if(row == 1) {
cell.shouldHideImageView(true)
} else {
cell.shouldHideImageView(false)
}
You should be all set.
You can try using a StackView, when you tell something to be hidden, the imageView the stack view will adjust the StackView as if the imageView was never a part of the view and it is an easy work around to not have to worry about constraints.
You can create IBOutlet on constraint and then just simply change the value like this:
buttonConstraint.constant = newValue
But i suggest you create for this a tableView. In this case you code and logic, i think, will be more accurate.
you could to this instead of hiding.
Make an outlet from the heights constraint of the imageview, call it constraint for now.
Set constraint.constant = 0 // effectively same as hiding.
Set constraint.constant = NON_ZERO_VALUE // effectively same as show.
hope it helps!
I see a couple of options. The first is a little easier to implement but a little less flexible if you decide to change your layout later.
Make the button's constraint to be below the label. Keep a reference to this constraint (you can connect it to your code via storyboard just like you do with the button itself, if you're using storyboard). When the imageView is visible, set myConstraint.constant += myImageView.frame.height. When the imageView is hidden, set myConstraint.constant -= myImageView.frame.height. Afterwards, call view.setNeedsLayout to update your constraints.
Make two constraints: one for below the image, and one for below the label ("constraintToImage" and "constraintToLabel"). Hook them both up to your controller like in option 1, and call view.addConstraint(constraintToImage) and view.removeConstraint(constraintToLabel) when the image becomes visible (and the opposite for when it's hidden). Again, call view.setNeedsLayout after.

Swift ScrollView In UITableViewCell not scrolling

I am new to swift and am trying to add a UIScrollview to a custom UITableViewCell. I can't seem to get the scrollview to scroll in the simulator though. I have tested both vertical and horizontal scrolling.
Here is the code for my custom UITableViewCell
import UIKit
class CustomTableViewCell: UITableViewCell, UIScrollViewDelegate {
#IBOutlet weak var winLoseValueLabel: UILabel!
#IBOutlet weak var dateLabel: UILabel!
#IBOutlet weak var newTotalLabel: UILabel!
#IBOutlet weak var locationLabel: UILabel!
#IBOutlet weak var playersLabel: UILabel!
#IBOutlet weak var playersScrollView: UIScrollView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.playersLabel.text = nil
//self.playersScrollView.contentSize.height = 1000
self.playersScrollView.contentSize.width = 1000
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func addLabelToScrollView(str : String) {
if self.playersLabel.text == nil{
self.playersLabel.text = str
}
else{
self.playersLabel?.text = self.playersLabel.text! + "\n\(str)"
}
}
}
My playersScrollView outlet has been properly connected to the scrollview in my storyboard. As far as I can see from all of the tutorials and sources online, I should just have to set the contentSize width or height (larger than the view area) to get it to scroll, which I have done in the awakeFromNib function.
Any ideas why this is not working in the simulator? Secondly, ideally I would like to have a vertical scrolling scrollview in the table cell, but I thought that the table view's vertical scrolling might have been interfering with the scrollview, so I changed it for horizontal scrolling for testing, which also didn't work.
Can you have a vertical scrollview in a vertically scrolling UITableView, or will the table view scrolling interfere too much with the scrollview?
Ok, it turns out that the constraints on my playersLabel, which is a subview of playersScrollView, was the culprit, although I am not sure why. I adjusted the constraints on the label and that allowed the horizontal scrolling to work.
The vertical scrolling still did not work, so I had to override the touchesBegan and touchesEnded methods in the scroll view so I could disable/re-enable the scrolling of the table view.

Resources