更改 Parse PFQueryTableViewController 单元格的样式
Change Parse PFQueryTableViewController Cells' Style
我目前使用 PFQueryTableViewController,我的 UITableView
看起来像一个标准 TableView
我希望它看起来像视图中每个项目一个圆角矩形。根据下面的回答,我的代码目前是:
Cell.m
- (void)layoutSubviews {
[super layoutSubviews];
self.imageView.frame = CGRectMake(1,1,69,69);
}
+ (CGFloat)heightForCellWithName:(NSString *)name contentString:(NSString *)content
{
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20.0, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin // wordwrap?
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
return 10 + 50 + 10 + contentSize.height + 10 + 20 + 10 + 30;
}
PFQueryTableViewController
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
PFObject *entry = [self.objects objectAtIndex:indexPath.row];
NSString *commentString = entry[@"Request"];
NSString *nameString = @"";
NSLog(@"%@", commentString);
return [Cell heightForCellWithName:nameString contentString:commentString] + 50;
}
这样做returns这个:
更新
虽然主要问题已解决,但我注意到如果 contentLabel.text 太大,它会开始覆盖 likeButton 和 commentButtons。
您将不得不根据文本内容动态设置单元格的高度...我在我的项目中也这样做过,而且非常简单...创建一个自定义 UITableviewcell,它具有class 方法 +(CGFloat)heightForCellWith:(NSString *)content
和 return 在 return 调整当前可见单元格的高度时调用它...这是一些示例代码
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *commentString = [self.objects[indexPath.row] objectForKey:kPHGlobalChatTextKey];
PFUser *commentAuthor = (PFUser *)[object objectForKey:kPHGlobalChatUserKey];
NSString *nameString = @"";
if (commentAuthor) {
nameString = [commentAuthor objectForKey:kPHUserDisplayNameKey];
}
return [PHChatCell heightForCellWithName:nameString contentString:commentString] + 50;
}
基本上我是根据传入的文本设置单元格的高度...下面是该方法的实现方式:
+ (CGFloat)heightForCellWithName:(NSString *)name contentString:(NSString *)content
{
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20.0, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin // wordwrap?
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
/*
* header spacing
* profile picture
* spacing
* content
* spacing
* like/comment label
* spacing
* like/comment button
*/
return 10 + 50 + 10 + contentSize.height + 10 + 20 + 10 + 30;
}
如你所见,我什至没有使用用户名来确定单元格的高度,只是传递给方法的字符串的内容...
这是结果的图片...
是的...创建标签时...您需要 [label numberOfLines:0]
进行设置。
编辑
查看我用于屏幕截图的单元格...它应该为您清理一切并让您更好地了解发生了什么...标签的布局方式以及所有内容的设置方式.. .
Cell class 中没有包含调用 PHUtility
的方法。只需评论一下,你就可以开始了......它基本上处理了日期应该如何根据当前日期格式化。
编辑
设置内容标签高度的地方,将值更改为...
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 40.0, FLT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
注意 -40
...有两个地方需要更改,layoutsubviews 和 heightForCell class 方法
将 NSFontAttributeName 设置为您喜欢的任何值,只需确保您的 return 在 heightForCell class 方法和 layoutsubviews 中使用相同的 CGSize 变量。
由于cell view的x值原点是10,content label是在cell view里面,content labels的x origin值也是10,在主屏里面实际的x值是20,所以宽度需要成为主屏幕的宽度-40.
此外,这是我用来更好地格式化日期的方法...
#pragma mark - Date formatters
+(NSDateFormatter *)timeFormatter
{
static dispatch_once_t onceMark;
static NSDateFormatter *formatter = nil;
dispatch_once(&onceMark, ^{
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"];
});
return formatter;
}
+(NSDateFormatter *)formatter
{
static dispatch_once_t onceMark;
static NSDateFormatter *formatter = nil;
dispatch_once(&onceMark, ^{
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM d 'at' h:mm a"];
});
return formatter;
}
+ (NSString *)relativeDateStringForDate:(NSDate *)date
{
#ifdef __IPHONE_8_0
NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear;
#else
NSCalendarUnit units = NSDayCalendarUnit | NSWeekOfYearCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
#endif
// if `date` is before "now" (i.e. in the past) then the components will be positive
NSDateComponents *components = [[NSCalendar currentCalendar] components:units
fromDate:date
toDate:[NSDate date]
options:0];
if (components.year > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.month > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.weekOfYear > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.day > 0) {
return (components.day == 1) ?
[[PHUtility formatter] stringFromDate:date] :
[NSString stringWithFormat:@"Yesterday at %@", [[PHUtility timeFormatter] stringFromDate:date]];
}
if (components.year == 0 && components.month == 0 && components.weekOfYear == 0 && components.day == 0){
return [NSString stringWithFormat:@"Today at %@", [[PHUtility timeFormatter] stringFromDate:date]];
}
return nil;
}
编辑
为了帮助您解决按钮选择问题,每次用户设置祈祷时,您都必须 RE-SET UIButtons 背景颜色...
为了解决您的问题,我是如何实现该方法的:
- (void)setLikeStatus:(BOOL)liked {
[self.likeButton setSelected:liked];
if (liked) {
[self.likeImage setImage:[UIImage imageNamed:@"ButtonLikeSelected.png"]];
[self.likeButton setBackgroundColor:[UIColor blueColor]];
return;
}
[self.likeImage setImage:[UIImage imageNamed:@"ButtonLike.png"]];
[self.likeButton setBackgroundColor:buttonColor];
}
我目前使用 PFQueryTableViewController,我的 UITableView
看起来像一个标准 TableView
我希望它看起来像视图中每个项目一个圆角矩形。根据下面的回答,我的代码目前是:
Cell.m
- (void)layoutSubviews {
[super layoutSubviews];
self.imageView.frame = CGRectMake(1,1,69,69);
}
+ (CGFloat)heightForCellWithName:(NSString *)name contentString:(NSString *)content
{
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20.0, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin // wordwrap?
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
return 10 + 50 + 10 + contentSize.height + 10 + 20 + 10 + 30;
}
PFQueryTableViewController
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
PFObject *entry = [self.objects objectAtIndex:indexPath.row];
NSString *commentString = entry[@"Request"];
NSString *nameString = @"";
NSLog(@"%@", commentString);
return [Cell heightForCellWithName:nameString contentString:commentString] + 50;
}
这样做returns这个:
更新
虽然主要问题已解决,但我注意到如果 contentLabel.text 太大,它会开始覆盖 likeButton 和 commentButtons。
您将不得不根据文本内容动态设置单元格的高度...我在我的项目中也这样做过,而且非常简单...创建一个自定义 UITableviewcell,它具有class 方法 +(CGFloat)heightForCellWith:(NSString *)content
和 return 在 return 调整当前可见单元格的高度时调用它...这是一些示例代码
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *commentString = [self.objects[indexPath.row] objectForKey:kPHGlobalChatTextKey];
PFUser *commentAuthor = (PFUser *)[object objectForKey:kPHGlobalChatUserKey];
NSString *nameString = @"";
if (commentAuthor) {
nameString = [commentAuthor objectForKey:kPHUserDisplayNameKey];
}
return [PHChatCell heightForCellWithName:nameString contentString:commentString] + 50;
}
基本上我是根据传入的文本设置单元格的高度...下面是该方法的实现方式:
+ (CGFloat)heightForCellWithName:(NSString *)name contentString:(NSString *)content
{
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20.0, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin // wordwrap?
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
/*
* header spacing
* profile picture
* spacing
* content
* spacing
* like/comment label
* spacing
* like/comment button
*/
return 10 + 50 + 10 + contentSize.height + 10 + 20 + 10 + 30;
}
如你所见,我什至没有使用用户名来确定单元格的高度,只是传递给方法的字符串的内容...
这是结果的图片...
是的...创建标签时...您需要 [label numberOfLines:0]
进行设置。
编辑
查看我用于屏幕截图的单元格...它应该为您清理一切并让您更好地了解发生了什么...标签的布局方式以及所有内容的设置方式.. .
Cell class 中没有包含调用 PHUtility
的方法。只需评论一下,你就可以开始了......它基本上处理了日期应该如何根据当前日期格式化。
编辑
设置内容标签高度的地方,将值更改为...
CGSize contentSize = [content boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 40.0, FLT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13.0f]}
context:nil].size;
注意 -40
...有两个地方需要更改,layoutsubviews 和 heightForCell class 方法
将 NSFontAttributeName 设置为您喜欢的任何值,只需确保您的 return 在 heightForCell class 方法和 layoutsubviews 中使用相同的 CGSize 变量。
由于cell view的x值原点是10,content label是在cell view里面,content labels的x origin值也是10,在主屏里面实际的x值是20,所以宽度需要成为主屏幕的宽度-40.
此外,这是我用来更好地格式化日期的方法...
#pragma mark - Date formatters
+(NSDateFormatter *)timeFormatter
{
static dispatch_once_t onceMark;
static NSDateFormatter *formatter = nil;
dispatch_once(&onceMark, ^{
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"];
});
return formatter;
}
+(NSDateFormatter *)formatter
{
static dispatch_once_t onceMark;
static NSDateFormatter *formatter = nil;
dispatch_once(&onceMark, ^{
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM d 'at' h:mm a"];
});
return formatter;
}
+ (NSString *)relativeDateStringForDate:(NSDate *)date
{
#ifdef __IPHONE_8_0
NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear;
#else
NSCalendarUnit units = NSDayCalendarUnit | NSWeekOfYearCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
#endif
// if `date` is before "now" (i.e. in the past) then the components will be positive
NSDateComponents *components = [[NSCalendar currentCalendar] components:units
fromDate:date
toDate:[NSDate date]
options:0];
if (components.year > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.month > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.weekOfYear > 0) {
return [[PHUtility formatter] stringFromDate:date];
} else if (components.day > 0) {
return (components.day == 1) ?
[[PHUtility formatter] stringFromDate:date] :
[NSString stringWithFormat:@"Yesterday at %@", [[PHUtility timeFormatter] stringFromDate:date]];
}
if (components.year == 0 && components.month == 0 && components.weekOfYear == 0 && components.day == 0){
return [NSString stringWithFormat:@"Today at %@", [[PHUtility timeFormatter] stringFromDate:date]];
}
return nil;
}
编辑
为了帮助您解决按钮选择问题,每次用户设置祈祷时,您都必须 RE-SET UIButtons 背景颜色...
为了解决您的问题,我是如何实现该方法的:
- (void)setLikeStatus:(BOOL)liked {
[self.likeButton setSelected:liked];
if (liked) {
[self.likeImage setImage:[UIImage imageNamed:@"ButtonLikeSelected.png"]];
[self.likeButton setBackgroundColor:[UIColor blueColor]];
return;
}
[self.likeImage setImage:[UIImage imageNamed:@"ButtonLike.png"]];
[self.likeButton setBackgroundColor:buttonColor];
}