I am getting the following error output:
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2016-05-29 20:02:36.092 City[353:33890] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x1461c600 h=--& v=--& UIView:0x14629380.midX == + 80.2612>",
"<NSAutoresizingMaskLayoutConstraint:0x1461c630 h=--& v=--& H:[UIView:0x14629380(64.5225)]>",
"<NSAutoresizingMaskLayoutConstraint:0x1451e6a0 h=--& v=--& UIView:0x1460ac80.midX == + 172.364>",
"<NSAutoresizingMaskLayoutConstraint:0x1451e6d0 h=--& v=--& H:[UIView:0x1460ac80(283.272)]>",
"<NSLayoutConstraint:0x1461dbd0 UITextView:0x14b15000'Fabian Delph has been dro...'.leading == UIView:0x14629380.leading + 8>",
"<NSLayoutConstraint:0x1451e500 UITextView:0x14b15000'Fabian Delph has been dro...'.leading == UIView:0x1460ac80.leading + 8>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1461dbd0 UITextView:0x14b15000'Fabian Delph has been dro...'.leading == UIView:0x14629380.leading + 8>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
All of the views in my UICollectionViewCell
are created programmatically in the below method, with the exception of the messageTextView
which is defined in storyboard. I know there is an issue with some of the autoresizing constaints, however I am not sure how to solve it. If I use the translatesAutoresizingMaskIntoConstraints = false
on the entire cell, nothing is shown on screen in the collectionView. I am having trouble understanding what UiView
the constraints are referring to, and what I can do to solve this issue.
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("message_cell" , forIndexPath: indexPath) as! DisplayMessageCollectionViewCell
let textBubbleView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(white: 0.95, alpha: 1)
view.layer.cornerRadius = 15
view.layer.masksToBounds = true
return view
}()
let profileImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .ScaleAspectFill
imageView.layer.cornerRadius = 15
imageView.layer.masksToBounds = true
imageView.backgroundColor = UIColor.redColor()
return imageView
}()
profileImageView.translatesAutoresizingMaskIntoConstraints = false
cell.messageTextView.translatesAutoresizingMaskIntoConstraints = false
//textBubbleView.translatesAutoresizingMaskIntoConstraints = false
if let messageText = chat_m[indexPath.row].text {
cell.messageTextView.text = messageText
cell.messageTextView.backgroundColor = UIColor.clearColor()
let sender_image = chat_m[indexPath.row].sender_image
cell.senderID = chat_m[indexPath.row].sender?.id
cell.frameView = view
profileImageView.image = sender_image
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)
print(estimatedFrame.width)
if let user_id = NSUserDefaults.standardUserDefaults().stringForKey("userId") {
if (user_id == chat_m[indexPath.row].sender?.id) {
profileImageView.hidden = true
cell.messageTextView.frame = CGRectMake(view.frame.width - estimatedFrame.width - 16 - 8, 0, estimatedFrame.width + 16, estimatedFrame.height + 20)
textBubbleView.frame = CGRectMake(view.frame.width - estimatedFrame.width - 16 - 8 - 16, -4, estimatedFrame.width + 16 + 8 + 10, estimatedFrame.height + 20 + 6)
textBubbleView.backgroundColor = UIColor(red: (69/255.0), green: (209/255.0), blue: (153/255.0), alpha: 1.0)
cell.messageTextView.textColor = UIColor.whiteColor()
}
else {
profileImageView.hidden = false
cell.messageTextView.textColor = UIColor.blackColor()
textBubbleView.backgroundColor = UIColor(white: 0.95, alpha:1)
cell.messageTextView.frame = CGRectMake(48 + 3, 0, estimatedFrame.width + 15, estimatedFrame.height + 20 )
textBubbleView.frame = CGRectMake(48, 0, estimatedFrame.width + 20, estimatedFrame.height + 20 )
}
}
}
cell.addSubview(textBubbleView)
cell.addSubview(profileImageView)
cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-4-[v0(30)]", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": profileImageView]))
cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[v0(30)]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": profileImageView]))
cell.sendSubviewToBack(textBubbleView)
cell.addSubview(profileImageView)
cell.bringSubviewToFront(profileImageView)
cell.addConstraint(NSLayoutConstraint(item: cell.messageTextView, attribute: .Trailing, relatedBy: .Equal, toItem: textBubbleView, attribute: .Trailing, multiplier: 1, constant: 0))
cell.addConstraint(NSLayoutConstraint(item:cell.messageTextView, attribute: .Leading, relatedBy: .Equal, toItem: textBubbleView, attribute: .Leading, multiplier: 1, constant: 8))
return cell
}
From your debug log:
"<NSLayoutConstraint:0x1461dbd0 UITextView:0x14b15000'Fabian Delph has been dro...'.leading == UIView:0x14629380.leading + 8>",
"<NSLayoutConstraint:0x1451e500 UITextView:0x14b15000'Fabian Delph has been dro...'.leading == UIView:0x1460ac80.leading + 8>"
You have two constraints (0x1461dbd0, 0x1451e500) with the same value that are bind to the different views. which may conflict.
Your textBubbleView
has different frame that depends on your logic, and don't have properly constraints (now it's using the default translatesAutoresizingMaskIntoConstraints which has value YES). You have the commented line, it's the right way, but you also must set the constraints for textBubbleView
in a way you did for profileImageView (leading, trailing, top, height - it depends on your requirement.
If you want your messageTextView
to have the layout depend on textBubbleView
-
remove old constraints first and re-add it:
[messageTextView removeConstraints: [messageTextView constraints]];