我正在尝试构建一个包含多个子视图的自定义 UITableCellView 但现在我只在其中两个(最大的)苦苦挣扎:一个 UIImageView (我不介意使用 UIWebView 代替,因为图像来自internet) 和一个 UITextView,它应该立即呈现所有文本而无需滚动。在这种情况下,我开始使用 XIB 文件和子类 UITableCellView (Autolayout disable) 构建自定义单元格:
我在自定义类中添加了两个新属性(IBOutlet)(非常简单):
@interface NewsFeedPostCell : UITableViewCell<UITextViewDelegate>
{
UIImageView *picView;
UITextView *postContent;
}
@property IBOutlet UIImageView *picView;
@property IBOutlet UITextView *postContent;
@end
之后我使用它们来填充数据(我从 iTunes 中获取一些返回漂亮 JSON @“ http://itunes.apple.com/search?term=ice%20age&country=us&entity=movie ”的东西)。目前,我专注于正确显示数据,而没有获得每个单元格的确切大小(除了不同的文本大小),但我有很多问题:内容没有正确显示,因为文本没有全部显示,首先行不显示图像等。我在stackoverflow上阅读了很多,但我开始对人们解决它的许多不同方式感到痛苦,因为我也测试过只使用代码来获取它并且我有类似的东西甚至更糟。
我的主要问题/抱怨是什么可能是构建具有不同高度和子视图的自定义单元格的复杂表格的最佳方法,以及如何计算尺寸,或者比这更好,何时何地(在代码中)因为heightForRowAtIndexPath
之前被调用我已经下载了图像以获取它们的大小。布局、重绘和“尺寸拟合”有很多属性,但其中任何一个似乎都没有像我想象的那样工作。我觉得我太远了,不知道 iOS 应用程序中的布局是如何工作的,而且在我看来 UI 元素根本没有灵活性:(
这是使用的源代码(顺便说一下,我使用 AFNetworking 库来获取图像并将它们加载到 UIImageView 中):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"PostCell";
NewsFeedPostCell *cell;
NSDictionary *post = [self.posts objectAtIndex:indexPath.row];
NSString *postText = [post objectForKey:@"longDescription"];
cell= (NewsFeedPostCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NewsFeedCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
CGRect picFrame = cell.picView.frame;
picFrame = CGRectMake(100, 0, 300, 100);
[cell.picView setFrame:picFrame];
[cell.picView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[post objectForKey:@"artworkUrl100"]]]
placeholderImage:nil
success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image ){
NSLog(@"Loaded successfully: %d", [response statusCode]);
[cell.picView setImage:image];
[cell.picView sizeToFit];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
NSLog(@"failed loading: %@", error);
}
];
CGSize stringSize = [self calculateTextHeight:postText];
CGRect postFrame = cell.postContent.frame;
postFrame = CGRectMake(10, 100, 300, stringSize.height);
cell.postContent.frame = postFrame;
cell.postContent.autoresizingMask = UIViewAutoresizingFlexibleHeight;
cell.postContent.font = [UIFont systemFontOfSize:POST_CONTENT_FONT_SIZE];
cell.postContent.text= postText;
[cell.postContent setContentInset:UIEdgeInsetsZero];
[cell.postContent sizeThatFits:cell.postContent.contentSize];
return cell;
}
查看截图中的问题(我正在使用模拟 3.5" 视网膜设备的 iOS 模拟器并用作构建应用程序 iOS SDK 6.1 的目标)
第一行(图像在顶栏下方;您必须滚动才能看到它)
另一行没有正确显示文本,我必须向下/向上滚动才能得到它:
并且不可能完成最后一行文本: