2009-11-20 2 views
2

Donc j'essaye de faire un UITableView qui a un fond répété. Je veux que l'arrière-plan défile avec le texte. Le hic, c'est que le fond est de 2 images. Il y a une image supérieure d'environ 550 pixels de hauteur, puis une image de répéteur de 2 pixels de hauteur. Je veux que l'image du haut défile avec la vue de la table et finisse par disparaître, puis l'image du segment se répète. Cette vue se trouve en fait en dessous d'un UITableView dans un contrôleur de vue.UITableView répétant l'arrière-plan avec 2 images

Voici mon dessin pour l'arrière-plan. J'appelle setNeedsDisplay quand la tableview sur le dessus défile.

-(void)drawRect:(CGRect) rect 
{ 

    CGRect topRect = CGRectMake(0, _tableViewRect.origin.y, 320, min(max(0, CGImageGetHeight(top) - _tableViewRect.origin.y), _tableViewRect.size.height)); 
    CGRect segmentRect = CGRectMake(0, topRect.size.height, 320, _tableViewRect.size.height - topRect.size.height); 

    if(topRect.size.height > 0) 
    { 
     CGImageRef newImageRef = CGImageCreateWithImageInRect(top, topRect); 
     UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 
     [newImage drawAtPoint:CGPointMake(0,0)]; 
    } 

    [[UIImage imageWithCGImage: segment] drawAsPatternInRect:segmentRect]; 
} 

Cela fonctionne mais il est très chuggy sur ma 3G. Est-ce que quelqu'un a des conseils d'optimisation, ou une autre façon de le faire?

Salutations

Répondre

2

Ne créez pas une nouvelle image à chaque fois; mettez en cache votre UIImage, puis utilisez les appels CoreGraphics pour repositionner votre CGContextRef afin de «pointer» vers la bonne zone, d'y ajouter l'image et de passer à autre chose. Si vous deviez profiler le code ci-dessus, j'imagine que CGImageCreateWithImageInRect() prenait la vaste la majorité de vos cycles.

Vous devriez probablement le faire en utilisant contentOffset, plutôt que selon _tableViewRect. Aussi, en regardant votre code, tout en se débarrassant des choses ci-dessus aidera, je ne suis pas sûr que ce sera suffisant, puisque vous allez redessiner beaucoup. Cela dit, voici un extrait qui peut fonctionner:

//I'm not sure what _tableViewRect is, so let's just assume you've got 
//some variable, tableScrollY, that represents the scroll offset of your table 

CGContextRef  context = UIGraphicsGetCurrentContext(); 

if (tableScrollY < top.size.height) {  //okay, we need to draw at least PART of our image 
    CGContextSaveGState(context); 
    CGContextDrawImage(context, CGRectMake(0, -tableScrollY, top.size.width, top.size.height), top.CGImage); 
} 

Cela devrait être un remplacement pour le milieu de partie si (...) de votre code. Ceci n'est pas testé, donc vous devrez peut-être le faire un peu avec.

+0

Oh d'accord. Quelle est la meilleure façon de blit. C'est ce que je voulais faire mais je n'ai pas vraiment trouvé quelque chose. – Meroon

+0

Consultez les documents CGContextRef (http://developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Reference/CGContext/Reference/reference.html), plus précisément CGContextDrawImage. Rappelez-vous, vous pouvez obtenir un CGImageRef sur un UIImage en utilisant la propriété .CGImageRef. –

+0

Je n'arrive pas à trouver comment bien mixer. Pouvez-vous me diriger vers des articles qui en discutent? Ou avez-vous du code? J'apprécie vraiment votre aide. – Meroon

Questions connexes