大佬教程收集整理的这篇文章主要介绍了ios – 具有异步加载图像的表视图单元格的动态高度,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
XIB文件:
细胞类:
// // PostTableViewCell.swift // Lome // // Created by Tobias Feistmantl on 10/09/15. // Copyright (c) 2015 Tobias Feistmantl. All rights reserved. // import UIKit import Alamofire class PostTableViewCell: UITableViewCell { @IBOutlet weak var userProfileImageView: TFImageView! @IBOutlet weak var usersNameLabel: UILabel! @IBOutlet weak var usernameLabel: UILabel! @IBOutlet weak var userProfileButton: TFCellButton! @IBOutlet weak var distanceLabel: UILabel! @IBOutlet weak var messageLabel: UILabel! @IBOutlet weak var postImageView: UIImageView! @IBOutlet weak var likeCountLabel: UILabel! @IBOutlet weak var timestampLabel: UILabel! @IBOutlet weak var likeButton: UIButton! @IBOutlet weak var constraintBetweenMessageLabelAndPostImageView: NSLayoutConstraint! var post: Post! { didSet { post.author.profileImage(version: .Thumbnail) { image,_ in self.userProfileImageView.image = image } if let name = post.author.fullName { usersNameLabel.text = name usernameLabel.text = post.author.username } else { usersNameLabel.text = post.author.username usernameLabel.hidden = true } if let attributedMessage = post.attributedMessage { messageLabel.attributedText = attributedMessage messageLabel.hidden = false constraintBetweenMessageLabelAndPostImageView.constant = 15 } else { messageLabel.hidden = true messageLabel.attributedText = nil constraintBetweenMessageLabelAndPostImageView.constant = 0 } post.image { image,_ in if let image = image { self.postImageView.image = image self.setNeedsUpdateConstraints() } } timestampLabel.text = "Posted \(post.createdAt.timeAgoSinceNow())" distanceLabel.text = post.distanceText likeCountLabel.text = "\(post.likesCount) Likes" likeButton.setImage(post.likeButtonImage,forState: .Normal) } } override func updateConstraints() { if let aspectRatio = post.imageAspectRatio { postImageAspectConstraint = NSLayoutConstraint(item: postImageView,attribute: NSLayoutAttribute.Width,relatedBy: NSLayoutRelation.Equal,toItem: postImageView,attribute: NSLayoutAttribute.Height,multiplier: CGFloat(aspectRatio),constant: 0) } super.updateConstraints() } func setupUserProfileButton(indexPath: NSIndexPath,viewController: UIViewController) { userProfileButton.indexPath = indexPath userProfileButton.addTarget(viewController,action: "userProfileButtonDidTouch:",forControlEvents: .TouchUpInside) } var postImageAspectConstraint: NSLayoutConstraint? { didSet { if let oldValue = oldValue { postImageView.removeConstraint(oldValue) } if let postImageAspectConstraint = postImageAspectConstraint { postImageView.addConstraint(postImageAspectConstraint) } } } override func prepareForReuse() { super.prepareForReuse() postImageAspectConstraint = nil } }
cellForRowAtIndexPath方法:
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("postCell",forIndexPath: indexPath) as! PostTableViewCell cell.post = posts[indexPath.row] cell.setupUserProfileButton(indexPath,viewController: self) return cell }
在应用程序启动时,一切都按预期工作,但如果我稍微晃动,约束开始破坏,图像的方面不再正确或其他一些奇怪的事情如下:
错误:
2015-09-28 11:58:27.546 Lome[32812:528936] 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) ( "<NSLayoutConstraint:0x7f8a008bf6f0 V:[Lome.TFImageView:0x7f8a008bf470(35)]>","<NSLayoutConstraint:0x7f89f9fbc490 V:|-(15)-[Lome.TFCellButton:0x7f8a0087fde0] (Names: '|':UITableViewCellContentView:0x7f8a008bf270 )>","<NSLayoutConstraint:0x7f8a00831520 Lome.TFCellButton:0x7f8a0087fde0.top == Lome.TFImageView:0x7f8a008bf470.top>","<NSLayoutConstraint:0x7f8a008315c0 Lome.TFCellButton:0x7f8a0087fde0.bottom == Lome.TFImageView:0x7f8a008bf470.bottom>","<NSLayoutConstraint:0x7f8a00831750 V:[Lome.TFCellButton:0x7f8a0087fde0]-(18)-[UILabel:0x7f8a008806d0'Water']>","<NSLayoutConstraint:0x7f8a00831840 H:|-(0)-[UIImageView:0x7f8a00830910] (Names: '|':UITableViewCellContentView:0x7f8a008bf270 )>","<NSLayoutConstraint:0x7f8a00831890 H:[UIImageView:0x7f8a00830910]-(0)-| (Names: '|':UITableViewCellContentView:0x7f8a008bf270 )>","<NSLayoutConstraint:0x7f8a008318e0 V:[UILabel:0x7f8a008806d0'Water']-(15)-[UIImageView:0x7f8a00830910]>","<NSLayoutConstraint:0x7f8a00831930 V:[UIImageView:0x7f8a00830910]-(20)-[UILabel:0x7f8a00830b90'0 Likes']>","<NSLayoutConstraint:0x7f8a00831980 V:[UILabel:0x7f8a00830b90'0 Likes']-(20)-| (Names: '|':UITableViewCellContentView:0x7f8a008bf270 )>","<NSLayoutConstraint:0x7f8a00860870 UIImageView:0x7f8a00830910.width == 0.6672*UIImageView:0x7f8a00830910.height>","<NSLayoutConstraint:0x7f8a0084e990 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8a008bf270(611)]>","<NSLayoutConstraint:0x7f8a0084f930 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7f8a008bf270(375)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7f8a008bf6f0 V:[Lome.TFImageView:0x7f8a008bf470(35)]> 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. 2015-09-28 11:58:27.547 Lome[32812:528936] 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) ( "<NSLayoutConstraint:0x7f89f9fbc490 V:|-(15)-[Lome.TFCellButton:0x7f8a0087fde0] (Names: '|':UITableViewCellContentView:0x7f8a008bf270 )>","<NSLayoutConstraint:0x7f8a0084f930 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7f8a008bf270(375)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7f8a00860870 UIImageView:0x7f8a00830910.width == 0.6672*UIImageView:0x7f8a00830910.height> 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.
我认为它与重用单元格有关,但正如您所看到的那样,约束将在prepareForReuse方法中被删除.
我目前非常沮丧,因为我试图解决这个问题几天,但没有找到解决方案.
我希望有人有解决方案.
提前致谢.
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7f8a00860870 UIImageView:0x7f8a00830910.width == 0.6672*UIImageView:0x7f8a00830910.height>
您已经将ImageView的水平约束固定到超级视图,间距为0.
现在,在更新宽高比约束时,您尝试将ImageView的宽度(通过保持宽度作为第一项)设置为其高度的比率,这将导致与其的前导/尾随约束冲突.
您需要通过交换第一个和第二个项目并反转宽高比因子来设置此ImageView的高度.
postImageAspectConstraint = NSLayoutConstraint(item: postImageView,multiplier: 1/CGFloat(aspectRatio),constant: 0)
以上是大佬教程为你收集整理的ios – 具有异步加载图像的表视图单元格的动态高度全部内容,希望文章能够帮你解决ios – 具有异步加载图像的表视图单元格的动态高度所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。