更改 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 url

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];
}