2013-01-17 4 views
1

J'essaie de créer une mise en page pour mon application iPhone et iPad qui se recharge automatiquement en fonction des données dynamiques. Un peu plus concret, cela signifie que j'ai plusieurs objets. Chaque objet a un certain type et des données associées. Le data est ce que vous devez afficher, le type détermine comment il devrait être affiché. Un type peut être texte, ce qui signifie qu'il doit être affiché en tant que texte simple sans possibilité d'interaction. Un autre type pourrait être date, ce qui signifie qu'il devrait être affiché comme un contrôle qui permet à l'utilisateur de sélectionner une date, lorsqu'il est engagé.Mise en page automatique avec des contrôles intégrés et rupture automatique du texte

Maintenant, le problème est que les objets que je veux afficher sont dynamiques en nombre et en données associées, donc je ne peux pas positionner les contrôles à des emplacements statiques.

This jsfiddle montre le type de disposition que je veux dire. En fonction de la largeur du div, le contenu est automatiquement redistribué et le contrôle de saisie de la date apparaît au milieu du texte.

Je n'ai pas trouvé de contrôle qui supporte un scénario comme celui-ci - alors comment j'y arriverais?

+0

Cela ressemble à un travail pour le HTML? – eggyal

+0

@eggyal: Je voudrais le faire en utilisant des widgets natifs. –

Répondre

2

Here est un exemple d'utilisation de CoreText pour résoudre un problème partiellement similaire. Peut-être que cela vous dirigera dans cette direction.

- (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; 
} 
Questions connexes