2010-09-09 6 views
19

J'ai une image affichée dans un CGRect. comment centrer le rect dans la vue?Centrer un CGRect dans une vue

voici mon code:

UIImage * image = [UIImage imageNamed:place.image]; 
CGRect rect = CGRectMake(10.0f, 90.0f, image.size.width, image.size.height); 

UIImageView * imageView = [[UIImageView alloc] initWithFrame:rect]; 
[imageView setImage:image]; 

J'ai essayé imageView.center mais sans effet.

merci d'avance.

Répondre

24

La propriété center de UIView est une propriété et non une méthode.

Vous devez calculer l'emplacement réel dans lequel vous souhaitez le placer. Vous pouvez le faire en définissant le cadre de la vue ou en définissant son centre, ce qui est plus simple dans votre cas.

Vous ne dites pas quelle vue vous allez alors faire imageView une sous-vue de. Si vous mettez à l'intérieur de quelque chose appelé superview, vous pouvez le faire:

CGPoint superCenter = CGPointMake(CGRectGetMidX([superview bounds]), CGRectGetMidY([superview bounds])); 
[imageView setCenter:superCenter]; 
4
CGRect r = thingToCenter.frame; 
r.origin = parentView.bounds.origin; 
r.origin.x = parentView.bounds.size.width/2 - r.size.width/2; 
r.origin.y = parentView.bounds.size.height/2 - r.size.height/2 + 12; 
thingToCenter.frame = r; 
5

Position du imageView dans le parentView en fonction de la taille et l'origine du rect du parentView.

Étant donné une vue parent nommé parentView:

float parentRect = parentView.frame; 
float imageRect = imageView.frame; 

imageRect.origin.x = (int)(parentView.origin.x + (parentRect.size.width - imageRect.size.width)/2); 
imageRect.origin.y = (int)(parentView.origin.y + (parentRect.size.height- imageRect.size.height)/2); 
imageView.frame = imageRect; 

casting les origines int assure que votre image centrée n'est pas floue (mais il peut être décentré par une quantité de sous-pixel).

+1

suggèrent étage utilisation (parentView.origin.x + ...) au lieu de (int) (parentView.origin.x + ...), parce que l'origine .x est CGFloat. Si vous lancez int, alors il sera lancé pour flotter à nouveau. –

3
CGRect CGRectIntegralCenteredInRect(CGRect innerRect, CGRect outerRect){ 
    CGFloat originX = floorf((outerRect.size.width - innerRect.size.width) * 0.5f); 
    CGFloat originY = floorf((outerRect.size.height - innerRect.size.height) * 0.5f); 
    return CGRectMake(originX, originY, innerRect.size.width, innerRect.size.height); 
} 
+1

vous devriez faire usage de 'CGRectIntegral()' au lieu de faire 'floorf()' par vous-même. – Hlung

0

Si la fonction est appelée fréquemment, vous pouvez également utiliser des macros comme indiqué ici pour plus de simplicité.

#define Center(x) CGPointMake(CGRectGetMidX(x), CGRectGetMidY(x)); 

utiliser ensuite comme

CGPoint myPoint = Center(myRect);