1

動的データに基づいて自動的にリフローする iPhone および iPad アプリのレイアウトを作成しようとしています。もう少し具体的に言うと、これは複数のオブジェクトがあることを意味します。各オブジェクトには、特定のタイプと関連データがあります。データは表示されるものであり、タイプは表示方法を決定します。型はtextである可能性があります。つまり、相互作用の可能性がない単純なテキストとして表示する必要があります。もう 1 つのタイプはdate です。つまり、ユーザーがタップしたときに日付を選択できるコントロールとして表示する必要があります。

ここでの問題は、表示したいオブジェクトの数と関連データが動的であるため、コントロールを静的な場所に配置できないことです。

この jsfiddleは、私が意味するレイアウトの種類を示しています。の幅に応じてdiv、コンテンツが自動的にリフローし、日付入力コントロールがテキストの中央に表示されます。

このようなシナリオをサポートするコントロールが見つかりませんでした。これを実現するにはどうすればよいでしょうか?

4

1 に答える 1

2

CoreTextを使用して、部分的に同様の問題を解決する例を次に示します。おそらくそれはあなたをその方向に向けるでしょう。

- (CFArrayRef)copyRectangularPathsForPath:(CGPathRef)path 
                                   height:(CGFloat)height {
    CFMutableArrayRef paths = CFArrayCreateMutable(NULL, 0, 
                                                   &kCFTypeArrayCallBacks);

    // First, check if we're a rectangle. If so, we can skip the hard parts.
    CGRect rect;
    if (CGPathIsRect(path, &rect)) {
        CFArrayAppendValue(paths, path);
    }
    else {
        // Build up the boxes one line at a time. If two boxes have the 
        // same width and offset, then merge them.
        CGRect boundingBox = CGPathGetPathBoundingBox(path);
        CGRect frameRect = CGRectZero;
        for (CGFloat y = CGRectGetMaxY(boundingBox) - height; 
                     y > height; y -= height) {
            CGRect lineRect =
                   CGRectMake(CGRectGetMinX(boundingBox), y, 
                              CGRectGetWidth(boundingBox), height);
            CGContextAddRect(UIGraphicsGetCurrentContext(), lineRect);

            // Do the math with full precision so we don't drift, 
            // but do final render on pixel boundaries.
            lineRect = CGRectIntegral(clipRectToPath(lineRect, path));
            CGContextAddRect(UIGraphicsGetCurrentContext(), lineRect);

            if (! CGRectIsEmpty(lineRect)) {
                if (CGRectIsEmpty(frameRect)) {
                    frameRect = lineRect;
                }
                else if (frameRect.origin.x == lineRect.origin.x && 
                         frameRect.size.width == lineRect.size.width) {
                    frameRect = CGRectMake(lineRect.origin.x,                                                                                                                                      lineRect.origin.y,                                                                                                                                      lineRect.size.width, 
                                CGRectGetMaxY(frameRect) - CGRectGetMinY(lineRect));
                }
                else {
                    CGMutablePathRef framePath =
                                         CGPathCreateMutable();
                    CGPathAddRect(framePath, NULL, frameRect);
                    CFArrayAppendValue(paths, framePath);

                    CFRelease(framePath);
                    frameRect = lineRect;
                }
            }
        }

        if (! CGRectIsEmpty(frameRect)) {
            CGMutablePathRef framePath = CGPathCreateMutable();
            CGPathAddRect(framePath, NULL, frameRect);
            CFArrayAppendValue(paths, framePath);
            CFRelease(framePath);
        }           
    }

    return paths;
}
于 2013-01-23T23:53:16.140 に答える