2009-08-02 10 views
12

Ich versuche, ein UIToolbar mit 5 Tasten mit benutzerdefinierten Bildern zu erstellen. Die Art und Weise, wie ich das mache, besteht darin, Schaltflächen vom Typ UIButtonTypeCustom zu erstellen und dann UIBarButtonItems daraus zu erstellen und diese dann der Symbolleiste mit setItems:animated: hinzuzufügen. Dies fügt jedoch Leerzeichen zwischen den Bildern hinzu, die dazu führen, dass das fünfte Bild halb auf der rechten Seite der Symbolleiste endet. Wie werde ich diese Räume los? Ich habe alles versucht, was mir einfällt.Wie entferne ich Leerzeichen in UIToolbar zwischen benutzerdefinierten Ansichten?

Hilfe wird sehr geschätzt.

Hier einige Beispiel-Code, wie ich darüber werde:

UIButton *button; 
UIBarButtonItem *barButton1,*barButton2; 

button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal]; 
button.bounds = CGRectMake(0,0,button.imageView.image.size.width, button.imageView.image.size.height); 
[button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside]; 
barButton1 = [[UIBarButtonItem alloc] initWithCustomView:button]; 


button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setImage:[UIImage imageNamed:@"bart_tb.png"] forState:UIControlStateNormal]; 
button.bounds = CGRectMake(0,0,button.imageView.image.size.width, button.imageView.image.size.height); 
[button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside]; 
barButton2 = [[UIBarButtonItem alloc] initWithCustomView:button]; 

NSArray *items = [NSArray arrayWithObjects: barButton1, barButton2, nil]; 
[self.toolbar setItems:items animated:NO]; 
+0

Haben Sie es jemals gelöst? – mk12

+0

Ich konnte es nie mit der Symbolleiste arbeiten. Ich konnte einfach nicht herausfinden, wie ich die mysteriösen Räume loswerden konnte. Am Ende habe ich auf eine UITabBar umgestellt und sie hat meine Bedürfnisse bisher erfüllt. –

Antwort

0
UIBarButtonItem *barButton1,*barButton2; 

barButton1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image1.png"] style:UIBarButtonItemStylePlain 
    target:self action:@selector(action:)]; 

barButton2 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"bart_tb.png"] style:UIBarButtonItemStylePlain 
    target:self action:@selector(action:)]; 

NSArray *items = [[NSArray alloc] initWithObjects: barButton1, barButton2, nil]; 
[barButton1 release]; 
[barButton2 release]; 
[self.toolbar setItems:items animated:NO]; 
[items release]; 

es tun, dass wie .. und wenn Sie die Breite der Tasten ändern möchten, setzen Sie die Eigenschaft width der UIBarButtonItem-Objekte. Der Standardwert für width ist 0, wodurch er groß genug ist, um genau zu seinem Bild/Titel zu passen.

Hoffe, dass hilft.

+0

Danke für Ihre schnelle Antwort. Leider hat das bei mir nicht funktioniert. Die Bilder werden als weiße Felder angezeigt (während sie mit der obigen Methode korrekt angezeigt werden) und die Lücken bleiben bestehen, auch wenn ich die width-Eigenschaft UIBarButtonItem ändere. Ich habe es noch einmal überprüft, um sicherzugehen, dass ich nichts anderes mit der Toolbar mache, die Dinge verderben könnte, und ich nicht. –

+0

Ich habe dies ein wenig später bearbeitet, stellen Sie sicher, dass Sie die [UIImage imageNamed: @ "] verwenden; auch wenn Sie immer noch ein Problem haben, ist die Art, wie dies getan werden sollte, wie ich Ihnen gezeigt habe, nicht mit einem UIButton. Wenn du zwei barbuttonitems hast, denke ich, dass sie an beide Enden der Symbolleiste gehen werden, denke ich, dass sie sich automatisch aussparen.Es kann sein, dass du eine IB-Datei verwenden willst, um deine Schnittstelle zu erstellen und dann zu codieren setze alle Eigenschaften so, wie sie in der Spitze sind. – mk12

+0

Ja, ich benutze [UIImage imageNamed ...]. Das Problem ist, dass diese Methode nur das Alpha des Bildes und ich möchte Farbbilder verwenden. Das zweite Problem ist, dass die Lücken immer noch auftreten, selbst wenn ich fünf Elemente hinzufüge, was dazu führt, dass das fünfte teilweise auf der rechten Seite der Symbolleiste endet.Wird es möglich, diese Lücken vollständig zu entfernen? –

5

Wenn Sie Abstandshalter zwischen den einzelnen Element hinzufügen, sollte der Abstand selbst ausrechnen. In Ihrem Fall möchten Sie vielleicht einen Abstandhalter auf beiden Seiten der beiden Tasten und einen dazwischen platzieren. Sie können dies tun, wie so:

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

NSArray *items = [[NSArray alloc] initWithObjects: spacer, barButton1, spacer, barButton2, spacer, nil]; 

[spacer release]; 

Beachten Sie, dass Sie auch UIBarButtonSystemItemFixedSpace verwenden können, aber Sie würden es ausdrücklich ‚width‘ Eigenschaft angeben müssen. Während UIBarButtonSystemItemFlexibleSpace dies für Sie funktioniert, scheint es.

+0

Das hat perfekt funktioniert. – galactikuh

2

Ich habe dieses Problem gelöst, sollten Sie flexible Element verwenden vor und nach jeder Taste.

UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

Fügen Sie einfach die flexibleSpace zu Ihrem Array von Elementen, die in der Symbolleiste festgelegt werden.

p.s. Ich habe mich fast selbst getötet, bevor ich es losgeworden bin und alle Arten von Lösungen versucht habe, einschließlich der Verwendung anderer Balken anstelle von UIToolBar.

+0

Dies gilt nicht für den Abstand links und rechts, nur zwischen den Tasten. –

2

Nun, das ist eine wirklich alte Frage, aber ich lief nur in die gleiche Ausgabe und schaffte es zu lösen.

Das magische Passwort ein UIBarButtonItem Stil setzt UIBarButtonItemStyleBordered werden.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:aView]; 
item.style = UIBarButtonItemStyleBordered; 

Thats it ...

+0

Hinweis: Wenn Sie customview für "UIBarButtonItem" festlegen, verlieren Sie den Aufruf für das Ziel und die Aktion. In diesem Fall, um ein Ziel und eine Aktion hinzuzufügen, verwenden Sie "UIButton" als benutzerdefinierte Ansicht und fügen Ziel und Aktion hinzu, oder wenn Sie eine "UIImageView" verwenden, dann fügen Sie "UITapGestureRecognizer" hinzu. – Hemang

2

Es ist möglich, einen festen Platz Element mit einer negativen Breite zwischen den Elementen hinzufügen, um den Abstand zu kompensieren.

UIBarButtonItem *fixedSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease]; 
fixedSpace.width = -12.0f; 
1

Ich traf das gleiche Problem. Schließlich habe ich das gelöst, indem ich UIToolbar unterklassifiziert habe und die Layout-Subviews-Methode überschrieben habe.

- (void)layoutSubviews { 

    [super layoutSubviews]; 

    if (leftItem_ && leftItem_.customView 
     && [leftItem_.customView isKindOfClass:[UIButton class]]) { 
    CGRect newFrame = leftItem_.customView.frame; 
    newFrame.origin.x = 0; // reset the original point x to 0; default is 12, wired number 
    leftItem_.customView.frame = newFrame;  
    } 

    if (rightItem_ && rightItem_.customView 
     && [rightItem_.customView isKindOfClass:[UIButton class]]) { 
    CGRect newFrame = rightItem_.customView.frame; 
    newFrame.origin.x = self.frame.size.width - CGRectGetWidth(newFrame); 
    rightItem_.customView.frame = newFrame; 
    } 

} 
17

Wenn Sie suchen ist, um das Layout UIBarButtonItems mit weniger als der Standard oder sogar 0 vertikale Abstand (wie mich), dass für automati Sie kaufen UIToolbar getan ist; Hier ist, was ich empfehlen würde:

UIToolbar Layouts es Artikel ist privat. Apple Ingenieure werden nie wirklich erwarten, dass Entwickler das überschreiben. Die Verwendung fester Leerzeichen zum Überschreiben des standardmäßigen 10-Punkte-Zeilenabstandes ist nicht ausreichend. Da UIToolbar seine Elemente Layout mindestens 10 Punkt auseinander, stellen Sie die Breite dieser UIBarButtonItems bis -10, um keinen Abstand zu erhalten, wie der folgende Code zeigt:

CGFloat toolbarHeight = 44.0; 
CGRect toolbarFrame = CGRectMake(0,0, self.view.bounds.size.width, toolbarHeight); 
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame]; 

UIBarButtonItem* noSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease]; 
UIBarButtonItem* noSpace1 = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease]; 

noSpace.width = -10.0; 
noSpace1.width = -10.0; 

[toolbar setItems:[NSArray arrayWithObjects: 
        [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil] autorelease], 
        noSpace, 
        [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:nil action:nil] autorelease], 
        noSpace1, 
        [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil] autorelease] 
        , nil]]; 
+1

Frustrierend, dass Apple keine Möglichkeit bietet, dies auf eine elegantere Weise zu tun – jjxtra

1

ich in der Lage war, dies in Xcode4 zu lösen, indem Setzen Sie einen flexiblen Platz als den am weitesten links liegenden Punkt und dann einen weiteren als den am weitesten rechts liegenden Punkt.

enter image description here
enter image description here

+0

Diese Frage ist immer noch relevant, und das ist die Antwort ab sofort (3 Jahre später!) – Troy

2

Zwischen zwei Bar-Taste können Sie den UIBarButtonSystemItemFixedSpace nehmen. Und passen Sie die Breite. Es hat für mich gearbeitet.

0

Ich konfrontiert das gleiche Problem heute und löste es mit einem einfachen Weg, So zu teilen.

Sie können eine neue UIView mit der gleichen Nummer nehmen. der Schaltfläche in der Symbolleiste, die Sie anzeigen möchten. und dann einfach die Größe gemäß der Symbolleiste festlegen.

Kurz gesagt, die normalen Schaltflächen über der Symbolleiste werden wie Symbolleistenschaltflächen aussehen.

Verwandte Themen