2009-07-14 13 views

risposta

101

Se ho letto correttamente la domanda, è possibile utilizzare colorWithPatternImage: su UIColor quindi impostare il colore di sfondo su un UIView.

Se è necessario utilizzare uno UIImageView, è possibile eseguire la stessa operazione, ma qualsiasi immagine posizionata nella vista dell'immagine verrà disegnata davanti all'immagine affiancata.

+0

Grazie! Bene, quello che voglio fare è: ho un file immagine con un motivo, che può essere ripetuto verticalmente e orizzontalmente. Voglio ripetere questo modello di immagine sul mio schermo. Forse risparmia un po 'di memoria. – Thanks

+1

Se si utilizza il metodo UIColor descritto, lo schermo verrà riempito con l'immagine del motivo. Ci sono modi più complessi ma dalla tua descrizione questo dovrebbe funzionare. –

+0

Ciao, funziona, ma l'Alpha dell'immagine non funziona. :(Qualsiasi soluzione –

30

Per ottenere alpha a lavorare con il reticolo a, assicuratevi di avere la seguente serie:

view.backgroundColor = [UIColor colorWithPatternImage:aImage]; 
view.layer.opaque = NO; 
+1

Le ultime due righe di questo frammento la stessa cosa – titaniumdecoy

+2

'view.layer.opaque = NO;' prevale – yasirmturk

15

Per anni ho usato l'approccio di Bill Dudney, ma iOS 6 è una soluzione molto migliore. E ... oggi ho trovato un modo per farlo funzionare anche su vecchie versioni di iOS.

  1. creare la nuova classe "UIImage + Piastrellabile" (fonte copia/incolla di seguito)
  2. importazione presente in tutte le fasce in cui si desidera un UIImageView immagine di piastrelle con. Si tratta di una categoria, in modo da "aggiornamenti" tutto il vostro UIImage di in quelli tileable, utilizzando standard di Apple chiama
  3. quando si desidera una versione "piastrelle" di un'immagine, chiamata: "image = [immagine imageResizingModeTile]"

UIImage + Tileable.h

#import <UIKit/UIKit.h> 

@interface UIImage (Tileable) 

-(UIImage*) imageResizingModeTile; 

@end 

UIImage + Tileable.m

#import "UIImage+Tileable.h" 

@implementation UIImage (Tileable) 

-(UIImage*) imageResizingModeTile 
{ 
    float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 

    if(iOSVersion >= 6.0f) 
    { 
     return [self resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeTile]; 
    } 
    else 
    { 
     return [self resizableImageWithCapInsets:UIEdgeInsetsZero]; 
    } 
} 
@end 
+0

Bella soluzione, qualsiasi idea di utilizzare questo per iOS 4? – Christoph

+0

Ho pensato che funzionasse su iOS 4+ , mi dispiace, funziona sicuramente su 5+, prova con 5 e assicurati che non sia qualcos'altro che non va (I h la prima volta che ho fatto questo) alcuni piccoli bug Se funziona su 5, ma non su 4, dovrai scrivere il tuo codice di piastrellatura (questo richiede circa 15 minuti per scrivere e eseguire il debug: creare un UIView personalizzato che disegna una griglia di UIImageViews ... o anche meglio, creare un'abitudine CALayer che implementa la chiamata drawInContext e splats una CGImage non elaborata più volte) – Adam

+0

Bene, non funziona su <5.0. Bella soluzione, ma ho scelto '[UIColor colorWithPatternImage: ...]' quindi. – Christoph

4

come mi piace molto Interface Builder ho creato questo UIImageView s ubclass di applicare sfondi a mosaico:

@interface PETiledImageView : UIImageView 

@end 

@implementation PETiledImageView 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    UIImage * imageToTile = self.image; 
    self.image = nil; 
    UIColor * tiledColor = [UIColor colorWithPatternImage:imageToTile]; 
    self.backgroundColor = tiledColor; 
} 

@end 

ho cercato override setImage: ma sembra IB non chiama quando la decodifica di un file pennino.

8

io uso una variante di @ soluzione di Rivera:

Inserire il seguente in un'estensione UIView:

- (void)setColorPattern:(NSString *)imageName 
{ 
    [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:imageName]]]; 
} 

quindi è possibile impostare il motivo di sfondo nel file storyboard/XI ter: Image showing how to set the colorPattern in the storyboard/xib

+3

Questa è un'ottima soluzione, ma si noti che non funzionerà in un file xib della schermata di avvio. "errore: le schermate di avvio non possono utilizzare attributi di runtime definiti dall'utente.". –

0

Versione rapida della soluzione di Daniel T. È comunque necessario impostare il valore keyPath in IB. Ovviamente potresti stare più attento a scartare l'UIImage opzionale.

extension UIView { 
    var colorPattern:String { 
     get { 
      return "" // Not useful here. 
     } 
     set { 
      self.backgroundColor = UIColor(patternImage: UIImage(named:newValue)!) 
     } 
    } 
}