使用XCode 4.5和iOS 6,我正在开发一个带有自定义单元格的简单表视图的应用程序.我已经在iOS 5及以下版本中完成了这一百次,但由于某种原因,新的autoLayout系统给了我很多麻烦.
我在IB中设置了我的表格视图和原型单元格,添加了子视图并将它们连接起来作为IBOutlets然后设置我的委托和dataSource.但是现在每当从第一个单元格中取出时cellForRowAtIndexPath,我都会收到以下错误:
***断言失败 - [ShopCell layoutSublayersOfLayer:],/ SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'执行-layoutSubviews后仍需要自动布局.ShopCell的-layoutSubviews实现需要调用super.
我没有在我的子类化单元格(ShopCell)中实现-layoutSubviews方法,即使我尝试这样做并添加超级调用,因为它表明我仍然得到相同的错误.如果我从IB中的单元格中删除子视图,并将其更改为标准的UITableViewCell,一切都按预期工作,但当然我的单元格中没有数据.
我几乎可以肯定,我有一些简单的东西,但我找不到任何文件或指南来暗示我做错了什么.任何帮助,将不胜感激.
编辑:只是尝试将其更改为IB中的UITableViewCell并保留所有子视图,仍然是相同的错误.
在过去的3到4个小时里,我一直把头撞在墙上,我似乎无法弄明白.我有一个UIViewController,里面有一个全屏UITableView(屏幕上有一些其他的东西,这就是为什么我不能使用UITableViewController)我想让我的tableHeaderView用autolayout调整大小.不用说,它不合作.
见下面的截图.

因为overviewLabel(例如"此处列出概述信息."文本)具有动态内容,所以我使用autolayout来调整它的大小和它的超级视图.除了tableHeaderView之外,我已经很好地调整了所有内容,它位于层次结构中的Paralax Table View之下.
我发现调整标题视图大小的唯一方法是以编程方式,使用以下代码:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,headerFrameHeight是tableViewHeader高度的手动计算,如下所示(innerHeaderView是白色区域,或者第二个"View",headerView是tableHeaderView):
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Run Code Online (Sandbox Code Playgroud)
手动计算有效,但如果将来发生变化,它会很笨拙并容易出错.我想要做的是让tableHeaderView根据提供的约束自动调整大小,就像你可以在其他地方一样.但对于我的生活,我无法弄明白.
关于这个问题有几个关于此的帖子,但没有一个是明确的,最后让我更加困惑.这里有几个:
我正在尝试为我的uiTableView创建一个标题视图(不是节标题,我已经有了.)我在界面构建器中设置了一个XIB.所有的连接都连接起来,它运行得很漂亮......除了桌子没有足够的空间!我的问题是表的顶部稍微重叠了表的标题.
我的XIB设置为所有按钮的自动布局,IB很高兴约束不会发生冲突/模糊.视图设置为自由形式大小,在我的情况下最终为320 x 471.然后在视图的约束中,我为视图设置了内在大小.
现在这与我的桌子完美搭配.一切看起来都很棒.但是如果我用代码手动更改标题视图中的任何字体,布局会使视图变大,最终会在我的表格下面.
任何想法如何让tableviewcontroller在设置字体和大小后留下足够的空间用于标题视图?我希望我有理由解释这一点.
我的表格视图的页脚是一个显示来自用户的一些推文的视图,所以在得到推文之前我不知道它的高度,我创建了一个FooterViewController有方法refreshTweets,我添加它viewDidLoad:
FooterViewController *controller = [[FooterViewController alloc] initWithNibName...];
[[self tableView] setFooterView:[controller view]];
[controller refreshTweets];
Run Code Online (Sandbox Code Playgroud)
在refreshTweets方法中,我阅读推文并计算总高度,并重置视图(页脚)的高度:
self.view.frame = newFrame;
Run Code Online (Sandbox Code Playgroud)
但它没有意义,页脚的高度仍然是我在Interface Builder中设置的高度,是否有任何遗漏或任何替代方法这样做?
谢谢!
编辑:我可以在界面构建器中将视图的大小更改为足够小,并且在计算推文的高度和设置view.frame后它会被放大,但是表格视图仍然认为其页脚具有先前的高度,即额外的空间在桌面视图之外,如果我将桌子向上拖动,我只能看到它.
我的应用程序创建了一个UITableViewController,它包含一个可能具有任意高度的自定义tableHeaderView.我一直在努力设置动态设置此标头,因为似乎建议的方法是缩短此标头.我的UITableViewController的相关代码:
import UIKit
import SafariServices
class RedditPostViewController: UITableViewController, NetworkCommunication, SubViewLaunchLinkManager {
//MARK: UITableViewDataSource
var post: PostData?
var tree: CommentTree?
weak var session: Session! = Session.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
// Get post info from api
guard let postData = post else { return }
//Configure comment table
self.tableView.registerClass(RedditPostCommentTableViewCell.self, forCellReuseIdentifier: "CommentCell")
let tableHeader = PostView(withPost: postData, inViewController: self)
let size = tableHeader.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize)
let height = size.height
let width = size.width
tableHeader.frame = CGRectMake(0, 0, width, height)
self.tableView.tableHeaderView = tableHeader
session.getRedditPost(postData) …Run Code Online (Sandbox Code Playgroud) 我有一个UIView包含多行的子类UILabel.此视图使用autolayout.

我想设置该视图为tableHeaderView的UITableView(不是一节头).此标题的高度取决于标签的文本,而标签的文本又取决于设备的宽度.那种场景自动布局应该很棒.
我发现并尝试了 许多 解决方案来实现这一点,但无济于事.我试过的一些事情:
preferredMaxLayoutWidth在期间为每个标签设置一个layoutSubviewsintrinsicContentSizetableHeaderView手动设置框架.我遇到的一些各种失败:
Auto Layout still required after executing -layoutSubviews解决方案(或解决方案,如有必要)应适用于iOS 7和iOS 8.请注意,所有这些都是以编程方式完成的.我已经设置了一个小型示例项目,以防您想要查看问题.我已将我的努力重置到以下起点:
SCAMessageView *header = [[SCAMessageView alloc] init];
header.titleLabel.text = @"Warning";
header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";
self.tableView.tableHeaderView = header; …Run Code Online (Sandbox Code Playgroud) 我想在tableView中添加一个标题.此标头包含1个UILabel.标题高度应根据标签所具有的行数计算.
在我的代码中,我正在添加标签<>标头的所有边缘的约束.这是我的尝试:
//Add header to tableView
header = UIView()
header.backgroundColor = UIColor.yellowColor()
tableView!.tableHeaderView = header
//Create Label and add it to the header
postBody = UILabel()
postBody.text = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog."
postBody.font = UIFont(name: "Lato-Regular", size: 16.0)
postBody.numberOfLines = 0
postBody.backgroundColor = FlatLime()
header.addSubview(postBody)
//Enable constraints for each item
postBody.translatesAutoresizingMaskIntoConstraints = false
header.translatesAutoresizingMaskIntoConstraints = false
//Add …Run Code Online (Sandbox Code Playgroud) 我正在使用UITableView委托方法viewForHeaderInSection在我的提供节标题UITableView.
我最初创建一个这样的视图:
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 50)];
Run Code Online (Sandbox Code Playgroud)
然后使用Autolayout添加一些子视图,然后返回 headerView
我遇到的问题是我不想具体指定headerView大小.我想使用Autolayout将左右边缘固定到视图的宽度.这是问题,我没有在Autolayout代码中使用的superview.
使用上面的代码,意味着标题视图不会在旋转时自动调整大小.您必须在轮换后重新加载tableview.
我有什么想法可以设置headerView它的边缘到tableview?
谢谢
ios ×7
autolayout ×6
uitableview ×5
objective-c ×3
swift ×2
uiview ×2
footer ×1
frame ×1
ios7 ×1
tweets ×1
xcode4.5 ×1