2013-08-25 7 views
1

J'ai une UIImageView dans mon fichier Nib qui s'étend sur la largeur de l'écran. Ce que je voudrais faire, c'est que le tiers moyen de l'image garde la même hauteur et la même largeur lorsque l'autorésisation est effectuée (avec la rotation du périphérique) et que seuls les 1er et 3ème tiers de l'image sont étirés.Autoriser l'image tout en conservant le centre

Des idées comment faire ceci?

Répondre

0

Pour autant que je sache, il n'existe pas de moyen simple de faire cela. Voici une façon de le faire:

Au lieu d'un seul ImageView, créez 3 UIImageView avec une largeur et une hauteur égales (1/3 de l'image originale). ImageView supérieur et inférieur collera respectivement sur le bord supérieur et inférieur, Image du milieu aura une marge inférieure et supérieure flexible. Vous devez définir la propriété contentMode de Middle ImageView sur UIViewContentModeScaleAspectFit (ou UIViewContentModeCenter en fonction de la façon dont vous souhaitez gérer la rotation) et les autres sur UIViewContentModeScaleToFill. Vous pouvez définir toutes ces propriétés à partir de IB.

Vous devez maintenant définir la source d'image de chacun d'après le code. Dans la méthode viewDidLoad tranche la UIImage en 3 parties en utilisant les solutions de ce post ou en utilisant le code suivant:

-(NSMutableArray *)getImagesFromImage:(UIImage *)image withRow:(NSInteger)rows withColumn:(NSInteger)columns 
{ 
    NSMutableArray *images = [NSMutableArray array]; 
    CGSize imageSize = image.size; 
    CGFloat xPos = 0.0, yPos = 0.0; 
    CGFloat width = imageSize.width/rows; 
    CGFloat height = imageSize.height/columns; 
    for (int y = 0; y < columns; y++) { 
     xPos = 0.0; 
     for (int x = 0; x < rows; x++) { 

      CGRect rect = CGRectMake(xPos, yPos, width, height); 
      CGImageRef cImage = CGImageCreateWithImageInRect([image CGImage], rect); 

      UIImage *dImage = [[UIImage alloc] initWithCGImage:cImage]; 
      [images addObject:dImage]; 
      xPos += width; 
     } 
     yPos += height; 
    } 
    return images; 
}  

Vous devrez peut-être modifier quelques petites choses, mais nous espérons que vous avez l'idée.

Si vous avez l'option, vous pouvez pré-scinder l'image en 3 parties en utilisant photoshop/gimp et les placer dans le paquet. Dans ce cas, vous n'avez pas besoin de découper l'image dans le code et tout peut être fait depuis IB.

Espérons que cela aide :)

Questions connexes