2012-05-17 13 views
37

Mam jeden widok i chcę ustawić backGroudColor dla tego widoku przez UIImage. Kod jak:ios: colorWithPatternImage, rozciągnij obraz w pełnym ekranie

self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]]; 

problem jest: backImage'frame jest niewielki niż widzenia. jak rozciągnąć UIImage do pełnego mojego widoku. I konw use UIImageView może dotrzeć.

ktoś ma dobry pomysł?

zmiana:

nie mogę przesłać jedno zdjęcie.

Jak to: wielkość backImge jest 30 * 30, a rozmiar moim zdaniem jest 1024 * 700, podczas korzystania myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backImage.png"]];

wynik jest myview za backGroup ma wiele 'backImage.png'. moim celem jest posiadanie jednego 'backImage.png' streth full myview.

+0

można pokazać jakiś obraz, aby dostać się nam trochę więcej pojęcia o problemie? – rishi

+0

Może to być twój problem - http://stackoverflow.com/questions/8651276/background-color-colorwithpattern-not-filling-entire-view-ipad – rishi

Odpowiedz

23

O ile mi wiadomo, nie można bezpośrednio zmienić rozmiaru obrazu tła. Najprostszym sposobem jest zmiana obrazu tak, aby pasował do rozmiaru ramki widoku rodzica. Możesz też przerysować obraz, dopasowując go do rozmiaru widoku nadrzędnego.

UIView * yourView = [[UIView alloc] initWithFrame:CGRectMake(10.f, 100.f, 300.f, 100.f)]; 
UIImage * targetImage = [UIImage imageNamed:@"backImage.png"]; 

// redraw the image to fit |yourView|'s size 
UIGraphicsBeginImageContextWithOptions(yourView.frame.size, NO, 0.f); 
[targetImage drawInRect:CGRectMake(0.f, 0.f, yourView.frame.size.width, yourView.frame.size.height)]; 
UIImage * resultImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext(); 

[yourView setBackgroundColor:[UIColor colorWithPatternImage:resultImage]]; 
112

Spróbuj.

self.layer.contents = (id)[UIImage imageNamed:@"freshBackground.png"].CGImage;

+2

Działa idealnie :) – delannoyk

+1

Tak, działa dobrze, ale dowolne pomysł jak? –

+0

Oto samouczek, który wyjaśnia: http: //www.raywenderlich.com/2502/calayers-tutorial-for-ios-introduction-to-calayers-tutorial – SirNod

2

I na podstawie odpowiedzi Kjuly jest, jeśli obraz ma być usytuowane odpowiednio na środku zamiast rozciągnięciu użyć tej metody, aby uzyskać nowy obraz:

#pragma mark - Image 
+(UIImage*)imageFitInCenterForSize:(CGSize)inSize forSourceImage:(UIImage*)inImage 
{ 
    // redraw the image to fit |yourView|'s size 
    CGSize imageOriginalSize = inImage.size; 
    UIImage *resultImage = nil; 
    if (imageOriginalSize.width<=inSize.width && imageOriginalSize.height<=inSize.height) 
    { 
     UIGraphicsBeginImageContextWithOptions(inSize, NO, 0.f); 
     [inImage drawInRect:CGRectMake((inSize.width-imageOriginalSize.width)/2.0, (inSize.height-imageOriginalSize.height)/2.0, imageOriginalSize.width, imageOriginalSize.height)]; 
     resultImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
    return resultImage; 
} 

To samo z przeciążony wariant:

+(UIImage*)imageFitInCenterForSize:(CGSize)inSize forSourceImage:(UIImage*)inImage xOffset:(CGFloat)inXOffset yOffset:(CGFloat)inYOffset 
{ 
    // http://stackoverflow.com/questions/10629403/ios-colorwithpatternimage-stretch-image-full-screen 
    // redraw the image to fit |yourView|'s size 
    CGSize imageOriginalSize = inImage.size; 
    UIImage *resultImage = nil; 
    if (imageOriginalSize.width<=inSize.width && imageOriginalSize.height<=inSize.height) 
    { 
     UIGraphicsBeginImageContextWithOptions(inSize, NO, 0.f); 
     [inImage drawInRect:CGRectMake((inSize.width-imageOriginalSize.width)/2.0+inXOffset, (inSize.height-imageOriginalSize.height)/2.0+inYOffset, imageOriginalSize.width, imageOriginalSize.height)]; 
     resultImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
    return resultImage; 
} 
+0

Ta pomoc mw bardzo dobrze – CRDave

3

world000 za odpowiedź tłumaczone SWIFT:

self.layer.contents = UIImage(named: "freshBackground.png")?.CGImage 
0

Na podstawie wcześniejszych komentarzy jest to wersja, która najpierw skaluje obraz, a następnie przycina proporcjonalnie do wypełnienia.

func imageScaledToFillSize(size: CGSize, image: UIImage) -> UIImage 
{ 
    let aspect = image.size.width/image.size.height; 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    if (size.width/aspect <= size.height) { 
     let resizedImg = self.imageScaledToSize(CGSize(width: size.height * aspect, height: size.height), image: image) 
     resizedImg.drawInRect(CGRectMake((size.width - resizedImg.size.width)/2, 0, resizedImg.size.width, resizedImg.size.height)) 
    } else { 
     let resizedImg = self.imageScaledToSize(CGSize(width: size.width, height: size.width/aspect), image: image) 
     resizedImg.drawInRect(CGRectMake(0, (size.height-resizedImg.size.height)/2, resizedImg.size.width, resizedImg.size.height)) 
    } 
    let imageR = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return imageR; 
} 

func imageScaledToSize(size: CGSize, image: UIImage) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0); 
    image.drawInRect(CGRectMake(0.0, 0.0, size.width, size.height)) 
    let imageR = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext(); 
    return imageR; 
} 
0

użyć następującej metody:

  1. opracowania obrazu w określonych granicach (co sprawia, że ​​skala)
  2. użyciu obraz wynikowy jako wzorzec.

Kod:

UIGraphicsBeginImageContext(self.window.frame.size); 
[[UIImage imageNamed:@"background"] drawInRect:self.window.bounds]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
self.window.backgroundColor = [UIColor colorWithPatternImage:image]; 
Powiązane problemy