在iOS中绘制标尺 - 在屏幕上精确1厘米 - 如何绘制相距1毫米的线条?

时间:2015-09-07 11:48:36

标签: ios objective-c ppi

我正在尝试为任何可用的iOS设备绘制一个标尺,在行/标记开始之间准确的1mm距离。通常我会得到PPI并计算我的像素距离。使用Objective-C,似乎没有这种方式。

linesDist应在“屏幕坐标像素”中包含1毫米的距离。

任何想法,我怎么能做到这一点?

我的基本代码如下所示:RulerView.m,这是一个UIView:

-(void)drawRect:(CGRect)rect
{
    [[UIColor blackColor] setFill];

    float linesDist = 3.0; // 1mm * ppi ??

    float linesWidthShort = 15.0;
    float linesWidthLong = 20.0;

    for (NSInteger i = 0, count = 0; i <= self.bounds.size.height; i = i + linesDist, count++)
    {
        bool isLong = (int)i % 5 == 0;

        float linesWidth = isLong ? linesWidthLong : linesWidthShort;
        UIRectFill( (CGRect){0, i, linesWidth, 1} );
    }
}

修改 ppi检测(非常难看),基于以下答案:

float ppi = 0;
switch ((int)[UIScreen mainScreen].bounds.size.height) {
    case 568: // iPhone 5*
    case 667: // iPhone 6
        ppi = 163.0;
        break;

    case 736: // iPhone 6+
        ppi = 154.0;
        break;

    default:
        return;
        break;
}

2 个答案:

答案 0 :(得分:2)

iPhone(iPhone6 +除外)每英寸163个“逻辑”点。显然,从4开始的手机的分辨率是两倍或更多,但这对坐标系没有任何影响。

因此,1mm是163 / 25.4或大约6.4。 iPad为每毫米5.2点,iPad mini与iPhone相同。

-(void)drawRect:(CGRect)rect
{
    [[UIColor blackColor] setFill];
    float i;

    float linesDist = 163.0/25.4; // ppi/mm per inch (regular size iPad would be 132.0)

    float linesWidthShort = 15.0;
    float linesWidthLong = 20.0;

    for (i = 0, count = 0; i <= self.bounds.size.height; i = i + linesDist, count++)
    {
        bool isLong = (int)count % 5 == 0;

        float linesWidth = isLong ? linesWidthLong : linesWidthShort;
        UIRectFill( (CGRect){0, i, linesWidth, 1} );
    }
} 

您希望为i使用浮点数,以避免在向上添加距离时出现舍入错误,并避免不必要的转换。

答案 1 :(得分:0)

我不确定但是,屏幕尺寸是以像素或点数计算的。您可以考虑其中任何一个并进行数学计算,以创建一个等于或大约等于mm的刻度1 pixel = 0.26 mm and 1 point = 0.35 mm.

所以在你的情况下,每1毫米画一个标记,差不多是3分。

尝试这样的事情:

UIView *markView = [[UIView alloc] initWithFrame:CGRectMake(x, y, 1, 1)];
lineView.backgroundColor = [UIColor blackColor];
[self.view addSubview:lineView];

// and increment the (x,y) coordinate for 3 points and draw a mark