3

利用可能なiOSデバイス用に、線/目盛りの開始間の正確な1mmの距離で定規を描画しようとしています。通常、私は PPI を取得し、ピクセルの距離を計算します。Objective-C を使用すると、このようには機能しないようです。

linesDist「画面座標ピクセル」に1mmの距離を含める必要があります。

どのように私はこれを達成することができますか?

私の基本的なコードは次のようになります: UIView である RulerView.m:

-(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;
}
4

2 に答える 2

3

iPhone (iPhone6+ は例外の可能性あり) は、1 インチあたり 163 の「論理」ポイントです。明らかに、4以降の電話は2倍以上の解像度を持っていますが、座標系には何の違いもありません.

したがって、1mm は 163/25.4 または約 6.4 です。iPadは1mmあたり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 に float を使用する必要があります。

于 2015-09-07T12:19:21.300 に答える
0

よくわかりませんが、画面サイズはピクセルまたはポイントで計算されます。それらのいずれかを考慮して、数学を実行して、次のように mm に等しいまたはほぼ等しいスケールを作成できます。1 pixel = 0.26 mm and 1 point = 0.35 mm.

したがって、あなたの場合、ほぼ 3 ポイントである 1 mm ごとにマークを描きます。

次のようなことを試してください:

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
于 2015-09-07T12:08:58.390 に答える