如何防止可变高度UITableViewCell中的一个像素边框显示为多个像素? [英] How do I prevent a one pixel border in variable height UITableViewCell from coming out as multiple pixels?

查看:30
本文介绍了如何防止可变高度UITableViewCell中的一个像素边框显示为多个像素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的测试应用中,我想为可变高度表单元格设置样式,并在顶部使用单个像素线.这是我正在使用的绘图代码,但是它不起作用.
以下是标头的代码:

In my test app, I want to style variable height table cells with a single pixel line at the top. This is the drawing code that I'm using, but it doesn't work.
Below is the code for the header:

// In OneLine.h
@interface OneLine : UIView {}
@end

和绘图代码:

// In OneLine.m
- (void)drawRect:(CGRect)rect {
    // Drawing code
    [[UIColor blackColor] set];
    UIRectFill(rect);
    [[UIColor whiteColor] set];
    UIRectFill(CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, 1));
}
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
        self.contentMode = UIViewContentModeTop;
    }
    return self;
}

唯一的问题是,我最终得到一条可变高度的白线.它并不总是一个像素高.我究竟做错了什么?我有一个用于提供测试单元的表格视图控制器.我这样初始化它:

The only problem is that I end up with a white line of variable height. It's not always one pixel tall. What am I doing wrong? I have a table view controller used to supply test cells. I initialize it like this:

// In MyTable.h
#import <UIKit/UIKit.h>

@interface MyTable : UITableViewController {
    NSMutableArray *data;
}
@end

带有代码(仅默认模板中已添加/更改的方法).

With the code (only the added/changed methods from the default template).

// In MyTable.m
#import "MyTable.h"
#import "OneLine.h

@implementation MyTable
- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {
        srand(time(NULL));
        data = [[NSMutableArray alloc] init];
        for (size_t index = 0; index < 200; ++index) {
            // Each cell has a different height betweet 40 and 50 pixels tall.
            [data addObject:[NSNumber numberWithInt:(rand() % 10) + 40.5]];
        }
    }
    return self;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
        cell.contentView.contentMode = UIViewContentModeTop;
        OneLine *view = [[OneLine alloc] initWithFrame:cell.contentView.bounds];
        [cell.contentView addSubview:view];
    }

    // Set up the cell...
    OneLine *view = [cell.contentView.subviews objectAtIndex:[cell.contentView.subviews count] - 1];
    // Build the correct frame
    view.frame = CGRectMake(0, 0, cell.contentView.bounds.size.width, [MyTable tableView:(UITableView*)self.view heightForRowAtIndexPath:indexPath]);
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [data count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSNumber *num = (NSNumber*) [data objectAtIndex:indexPath.row];
    return [num intValue];
}
@end

所有这些代码仅创建了一个表视图控制器,该控制器具有200个随机高度(高度介于40到50像素之间)的单元格.

All of this code just creates a table view controller with 200 cells of random height (between 40 and 50 pixels tall.

推荐答案

事实证明,我找到了解决自己问题的方法.在上面的代码中,您将看到表格单元格的高度不是一个整数(我更正了代码以显示实际问题).实际上,当您拥有分数高度表单元格时,您的原点可能位于小数像素处,并且从原点开始的矩形或直线可能会留下间隙,并且该单元格的最终高度可能会融合到以下单元格中.因此,请避免使用分数高度表单元格

Well, as it turns out, I found the solution to my own problem. In the code above, you'll see that the height of the table cells is not a round number (I corrected the code to show the real problem). In fact, when you have fractional height table cells, you're origin can be at a fractional pixel, and a rectangle or a line starting at the origin can leave a gap, and the final height of the cell might blend into the following cell. So, avoid fractional height tablecells

这篇关于如何防止可变高度UITableViewCell中的一个像素边框显示为多个像素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆