我正在尝试为任何可用的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;
}
答案 0 :(得分:2)
-(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