2012-04-25 6 views
13

Ich schreibe meine erste iOS-App für die iOS 5.0 + Plattform. Ich verwende das Protokoll UIAppearance, um die Benutzeroberfläche der Anwendungen anzupassen.UIImage resizableImageWithCapInsets: funktioniert nicht wie erwartet

Ich versuche, die Hintergründe für UIBarButtonItem über die gesamte Anwendung zu ändern. Aufgrund der Tatsache, dass meine UIBarButtonItem 's Größe je nach dem verwendeten Text oder Symbol ändern kann, versuche ich UIImage resizableImageWithCapInsets: mit meinem Hintergrund png zu verwenden.

Ich fand ursprünglich den Code, den ich benötigte Ray Wenderlich. Mit genau dem gleichen Code und einem Bild, das dem im oben genannten Tutorial ähnelt, bekomme ich seltsame Ergebnisse. Vielleicht ist es nur meine Unerfahrenheit mit Cocoa Touch.

Hier ist der Code, den ich verwende.

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)]; 

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
             forState:UIControlStateNormal 
             barMetrics:UIBarMetricsDefault]; 

Hier ist die png Hintergrundbild I

png background

Und hier ist das Ergebnis (im Simulator) zu verwenden, ich versuche,

result of trying to use resizableImageWithCapInsets:

Antwort

19

Der Bereich Ihres Bildes zwischen left und right und zwischen top und bottom ist gekachelt, um den Platz zu füllen, den das Bild benötigt. Versuchen Sie UIEdgeInsetsMake(15, 6, 15, 6).

Verallgemeinern, wenn Ihr Bild einen kontinuierlichen Farbverlauf hat, sollte der wiederholte Abschnitt nur 1 Pixel hoch sein. Da das Bild der Schaltfläche 31 Pixel hoch ist, sollten die Werte top und bottom (das erste und dritte Argument zu UIEdgeInsetsMake) zu 30 addiert werden. Sie müssen nicht gleich sein; UIEdgeInsetsMake(8, 6, 22, 6) verschiebt den wiederholten Abschnitt nach oben, was zu einem helleren Hintergrund führt.

Ist die Datei, die Sie anhängen, auch die normale oder die Retina ('@ 2x') Version des Bildes? Die Einfügungen müssen innerhalb der Größe der einfachen Version sein.

+0

Vielen Dank für Ihre Antwort. Das Bild ist @ 2x gepostet. Also sollte ich mir Messungen auf (0, 3, 0, 3) schneiden lassen? Du sagst, ich sollte die Mitte meines Bildes 1 Pixel breit machen? Ich verstehe, warum das so wäre, aber das Tutorial, dem ich folgte, hatte ein Bild mit 30px mal 40px, mit dem gleichen Stil-Verlauf wie ich und es scheint fantastisch zu funktionieren (mit dem UIEdgeInsetsMake, den ich gerade benutze, nur um ein Pixel angepasst) wegen meiner Eckenradien). –

+0

Hier ist der Trick: Sie können oben und unten 0 verwenden, wenn Ihr Hintergrundbild die gleiche Höhe wie eine Navigationsleiste hat.Es füllt nur diesen Raum mit Ihrem vorhandenen Farbverlauf. Ihr Bild ist nicht die Höhe einer Retina-Navigationsschaltfläche, daher wird es entweder gedehnt oder wiederholt, um diese Höhe zu füllen. Sie müssen eine obere und untere Cap-Größe angeben (das erste und das dritte Argument). Beginnen Sie mit '(7, 3, 7, 3)'. Dies wird einige Streifen hinterlassen, aber hoffentlich geben Sie eine klarere Vorstellung von dem, was vor sich geht. – Dondragmer

+0

Ahh das macht ein bisschen mehr Sinn. Wie groß ist die Größe einer Netzhaut-Navigationsleiste? Ich schneide meine UI-Elemente aus einer PSD-Datei in Retina-Größe. Wenn ich also die navBar-Schaltfläche in der PSD-Datei größer machen und sie exportieren muss, um das zu bekommen, was ich brauche, wird es mir leicht fallen. –

17

Ich habe genau das gleiche Problem.

Sie können auch den resizingMode von UIImageResizingModeStretch einstellen. Es hat mein Problem gelöst.

Hopwever, es ist nicht in IOS5 verfügbar. Also wäre meine Lösung zu tun, wie alle anderen sagten. Erkenne, dass die kachelbare Seite nur ein Pixel sein sollte. Die meisten Tasten ändern sich sowieso nicht viel in der Mitte.

So verwenden Sie diesen Code:

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset 
    { 
     if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) 
     { 
      return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch]; 
     } 
     else 
     { 
      float left = (self.size.width-2)/2;//The middle points rarely vary anyway 
      float top = (self.size.height-2)/2; 
      return [self stretchableImageWithLeftCapWidth:left topCapHeight:top]; 
     } 
    } 
+3

Vielen Dank, dass Sie sich die Zeit genommen haben, diese Frage zu beantworten, obwohl es sich um einen älteren Beitrag handelt. Sehr geschätzt! –

+1

Die anderen Antworten lösen das Problem nicht wirklich. Vielen Dank. –

+1

Danke! Hat super für mich gearbeitet. –

Verwandte Themen