webentwicklung-frage-antwort-db.com.de

Schaltfläche links von UISearchBar hinzufügen

Ich reiße mir hier die Haare aus. Mein Kunde möchte links neben einer Suchleiste eine Schaltfläche hinzufügen, wie im folgenden Beispiel:

alter Text http://www.erik.co.uk/images/IMG_0008.PNG

Aber ich kann einfach nicht herausfinden, wie es geht. Apple scheint keine dokumentierte Methode zum Hinzufügen benutzerdefinierter Schaltflächen zu einer UISearchBar zu bieten, ganz zu schweigen von der Suchleiste links davon. 

Ich habe versucht, in Interface Builder herumzuhacken und eine UIToolbar mit einer Schaltfläche nach links hinzuzufügen. Ich kann jedoch keine Kombination von Stilen finden, bei denen die beiden richtig angeordnet sind, um den Eindruck zu vermitteln, dass sie eins sind. Es gibt immer etwas, das wie ein Pixelunterschied in der vertikalen Ausrichtung aussieht, wie Sie im folgenden Bild sehen können:

alt text http://www.erik.co.uk/images/verticalalignment.png

Ich habe herumgesucht und finde die Antwort einfach nicht, aber wie wir auf dem Screenshot sehen können, muss es möglich sein!

Vielen Dank im Voraus für Ihre Hilfe.

Erik

29
Erik Carlson

Verwenden Sie eine Navigationsleiste anstelle einer Symbolleiste. Setzen Sie die Suchleiste auf die Titelansicht der Navigationsleiste.

In Interface Builder:

screenshot 1

Ergebnis: 

screenshot 2

39
kennytm

Sie können stattdessen das Lesezeichenbild ersetzen und bei Bedarf den Versatz anpassen. 
Zum Beispiel:

[self.searchDisplayController.searchBar setImage:[UIImage imageNamed:@"plus2"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
[self.searchDisplayController.searchBar setPositionAdjustment:UIOffsetMake(-10, 0) forSearchBarIcon:UISearchBarIconBookmark];

Behandeln Sie das Schaltflächenereignis in der Delegatmethode: 

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar

So sieht es aus:

white tinted UISearchBar with custom bookmark image

18
Yariv

Die erste Lösung besteht darin, UINavigationBar anstelle von UIToolbar zu verwenden, wie KennyTM bemerkt hat. Mit der Navigationsleiste können Sie jedoch nicht zufrieden sein, wie in meinem Fall, wenn ich 3 Tasten verwenden muss (in der Navigationsleiste dürfen nur 2 Tasten verwendet werden) - siehe linkes Bild. So habe ich es gemacht:

  1. Verwenden Sie Toolbar mit 3 Schaltflächen und Flexible Space Bar Button Item an der Stelle, an der die Suchleiste platziert werden soll.
  2. Setzen Sie die Suchleiste auf (nicht in) der Symbolleiste. Ziehen Sie dazu in Interface Builder die Suchleiste nicht in die Symbolleiste. Legen Sie ihn stattdessen in die Nähe und verschieben Sie ihn mit den Pfeiltasten auf der Tastatur (oder ändern Sie die X- und Y-Position in Interface Builder).
  3. Suchleiste, linke schwarze Linie darunter (siehe rechtes Bild). Zum Ausblenden füge ich eine weitere Ansicht mit der Höhe 1px und einem weißen Hintergrund hinzu.

Es sieht für mich ein bisschen schmutzig aus. Wenn Sie also eine bessere Lösung haben, lassen Sie es mich wissen.

screenshot

8
Mike Keskinov

Die einfachste Lösung ist, Ihre SearchBar in TOP Ihrer Toolbar hinzuzufügen (nicht in). Ich gebe Ihnen die beste Lösung, die ich in meinem Unternehmen eBuildy verwende:

UIBarButtonItem *mySettingsButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(refresh)];
UIBarButtonItem *mySpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *myRefreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
UIToolbar *myTopToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,0,320,40)];
UISearchBar *mySearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(70,1,220,40)];

[myTopToolbar setItems:[NSArray arrayWithObjects:mySettingsButton,mySpacer,myRefreshButton, nil] animated:NO];
[self.view addSubview:myTopToolbar];
[self.view addSubview:mySearchBar];
4
Thomas Decaux

beantwortung einer alten Frage hier, aber ich habe vor kurzem selbst mit dieser gekämpft und habe einige Mängel bei den anderen Antworten auf die Situation gefunden, die ich ansprechen wollte. Folgendes habe ich in einer Unterklasse von UISearchBar gemacht:

fügen Sie zunächst eine UIButton-Eigenschaft hinzu (hier "selectButton"). überschreiben Sie dann die initWithFrame-Methode und führen Sie Folgendes aus:

-(id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame])
{
    self.selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.selectButton.contentEdgeInsets = (UIEdgeInsets){.left=4,.right=4};
    [self.selectButton addTarget:self action:@selector(pressedButton:) forControlEvents:UIControlEventTouchUpInside];

    self.selectButton.titleLabel.numberOfLines = 1;
    self.selectButton.titleLabel.adjustsFontSizeToFitWidth = YES;
    self.selectButton.titleLabel.lineBreakMode = UILineBreakModeClip;

    [self addSubview:self.selectButton];
    [self.selectButton setFrame:CGRectMake(5, 6, 60, 31)];
}

return self;
}

Jetzt möchten Sie die Layout-Subviews-Methode überschreiben, um die Größe der Suchleiste auf die entsprechende Breite zu ändern. Dies hängt davon ab, ob die Schaltfläche "Abbrechen" angezeigt wird oder nicht. Das sollte ungefähr so ​​aussehen:

-(void)layoutSubviews
{
[super layoutSubviews];

float cancelButtonWidth = 65.0;
UITextField *searchField = [self.subviews objectAtIndex:1];

if (self.showsCancelButton == YES)
    [searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70 - cancelButtonWidth, 31)];
else
    [searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70, 31)];
}

Beachten Sie, dass in der obigen Methode eine Konstante für die cancelButtonWidth hinzugefügt wurde. Ich habe versucht, Code hinzuzufügen, um die Breite von [self cancelButton] zu erhalten, aber das scheint nur zur Laufzeit zugänglich zu sein und lässt das Projekt nicht kompilieren. In jedem Fall sollte dies ein guter Start für das sein, was Sie brauchen

3
Will Ayd

Wenn Sie eine benutzerdefinierte Schaltfläche auf der rechten Seite anstelle der Cancel-Schaltfläche wünschen, verwenden Sie einfach diesen Code (gültig für iOS 9 und höher):

[self.searchBar setShowsCancelButton:YES];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setTitle:@""];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setImage:[UIImage imageNamed:@"search"]];
0
Winston