2015-06-16 9 views
23

Testuję mój interfejs i uważam, że pasek wyszukiwania jest zbyt wąski, jak na mój gust. Chcę też mieć pewność, że osoby z gorszą wizją lub złą zręcznością manualną nie będą miały problemów z podniesieniem interfejsu, który chcą.Czy można zmodyfikować wysokość paska tekstowego UISearchbar TextField?

Co chciałbym zrobić, to ustawić wysokość UITextfield wewnątrz UISearchbar.

Co próbowałem: 1. W serii ujęć, dodać UISearchbar Wysokość przymusu - wyniki: zwiększa wielkość searchbar, ale UITextField wewnątrz pozostaje taka sama.

  1. dostęp do UITextField wewnątrz UISearchbar i zmiany jego wysokości - Wyniki: Wydajność konsoli pokazuje, że parametr ten jest zmodyfikowany, a na ekranie wysokość UITextField pozostaje taka sama.

Uwaga - można zmodyfikować inne parametry UITextField zastosowaniem metody 2 i zmiana odbija się na ekranie tak, wiem, że dotarcie do UITextField

Kodeks Metoda 2, położonej w viewDidLoad() z ViewController gdzie UISearchbar znajduje się:

for tempView in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] 
{ 
    if let tV = tempView as? UITextField 
    { 
    var currentFrameRect = tV.frame 
    currentFrameRect.size.height = 80 
    //tV.layer.backgroundColor = UIColor.blueColor().CGColor //This works fine 
    //tV.layer.cornerRadius = 5 //This works fine 
    //tV.font = UIFont(name: "Courier", size: 40) //This works fine 
    println(tV.frame.height) //console output:0.0 
    tV.frame = currentFrameRect 
    println(tV.frame) //console output:(0.0, 0.0, 0.0, 80.0) 
    println(currentFrameRect) //console output:(0.0, 0.0, 0.0, 80.0) - redundant, just checking 
    println(tV.frame.height) //console output:80.0 - it says 80, but screen shows searchbar definitely not 80. 
    } 
} 

myślę, że ma coś wspólnego z autolayout jakoś jest w stanie pominąć parametry niezależnie od tego, gdzie jest ona ustawiona. Chciałbym nadal używać autolayout, ponieważ robi to dla mnie wiele pracy, ale chciałabym, żeby zachował się tak, jak w Scenopisie, gdzie, gdy użytkownik ustawi ustawienie, użyje tych parametrów w swoim autolayout i narzeka, kiedy może ". t zamiast ignorować ustawienie bez sprzężenia zwrotnego.

Edit:

W odpowiedzi na Mahesh. Nie znam zbyt wiele obiektywnego C++, ale starałem się jak najlepiej przekształcić to, co napisałeś w szybkie. To jest to, co mam:

(Wewnątrz mojego viewcontroller.swift)

func viewDIdLayoutSubviews() 
{ 
    super.viewDidLayoutSubviews() 
    self.roomInfoSearchBar.layoutSubviews() 

    var topPadding: Float = 5.0 
    for view in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] 
    { 
    if let tfView = view as? UITextField 
    { 
     var calcheight = self.roomInfoSearchBar.frame.size.height - 10 
     tfView.frame = CGRectMake(tfView.frame.origin.x, CGFloat(topPadding), tfView.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2)) 
    } 
    } 
} 

Ja dotrzymałem kod na dotarcie do pola tekstowego, ponieważ miałem pewne problemy konwersji kodu SWIFT. Dla CGRectMake - Swift narzekał na różne typy, w tym to, że topPadding nie był CGFloat i dla ostatniej zmiennej (rozmiar Y), znowu nie lubił mieszania CGFloat z Float, więc musiałem to zmienić.

Niestety, wygląda na to, że nie działa. Zmieniłem wysokość UISearchbara na 80 w scenorysie i właśnie dostałem bardzo wysoki pasek wyszukiwania z polem tekstowym obejmującym około 1/3 całkowitej wysokości.

Edytuj # 2: Zawierające Yuyutsu i poprawioną wersję kodu Mahesha. Nadal nie jest doskonały, ale bliżej. Kod Yuyutsu działa, ale jak wspomniano w moich komentarzach, pole nie jest wyśrodkowane, zmiana rozmiaru jest również widoczna (skok od wysokości A do wysokości B), gdy widok jest najpierw ładowany. Jednym dodatkowym niedoborem jest to, że ponieważ zmiana rozmiaru następuje przy viewDidAppear po zmianie orientacji, pole powraca do rzeczywistego rozmiaru.

Mój kod na podstawie Yuyutsu użytkownika:

override func viewDidAppear(animated: Bool) 
    { 
    super.viewDidAppear(animated) 
    var roomInfoSearchBarFrame = roomInfoSearchBar.frame 
    var newHeight: CGFloat = 60 
    for subView in roomInfoSearchBar.subviews 
    { 
     for subsubView in subView.subviews 
     { 
     if let textField = subsubView as? UITextField 
     { 
      var currentTextFieldFrame = textField.frame 
      var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 
      var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) 

      textField.frame = newTextFieldFrame 
      textField.borderStyle = UITextBorderStyle.RoundedRect 
      textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight 
      //textField.backgroundColor = UIColor.redColor() 
      //     textField.font = UIFont.systemFontOfSize(20) 
     } 
     } 
    } 
    } 

Patrząc na kod Yuyutsu za chciałem wiedzieć gdzie indziej mógłbym umieścić tę regulację i natknąłem link za pośrednictwem innego stackoverflow postu. Na podstawie tego, co przeczytałem, zobaczyłem, że odpowiedź Mahesha powinna zadziałać. Właśnie wtedy zdałem sobie sprawę, dlaczego to nie działa - musiałem przesłonić func viewWillLayoutSubviews().

Aktualny kod: Zachowuje rozmiar ze zmianą orientacji. Ale wielkość skoku nadal widoczny (nie powinny być widoczne)

override func viewWillLayoutSubviews() 
    { 
    super.viewWillLayoutSubviews() 
    var roomInfoSearchBarFrame = roomInfoSearchBar.frame 
    var newHeight: CGFloat = 60 
    for subView in roomInfoSearchBar.subviews 
    { 
     for subsubView in subView.subviews 
     { 
     if let textField = subsubView as? UITextField 
     { 
      var currentTextFieldFrame = textField.frame 
      var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 
      var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) 

      textField.frame = newTextFieldFrame 
      textField.borderStyle = UITextBorderStyle.RoundedRect 
      textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight 
      //textField.backgroundColor = UIColor.redColor() 
      //     textField.font = UIFont.systemFontOfSize(20) 
     } 
     } 
    } 
    } 

Więc teraz, jedyną rzeczą, w lewo jest, aby spróbować i zrobić to tak polu tekstowym jest zbiór rozmiar przed pogląd jest widoczny tak nie ma przesunięcia wielkości, które jest widoczne dla użytkownika.

Finał Edit: Całkowicie kod roboczych Z dodatkową pomoc Yuyutsu jest kod poniżej nie wszystko chcę - zaczyna się na wielkości zadanej, pole jest skoncentrowane, dotyczy obrotu grzywny.

override func viewDidLayoutSubviews() 
    { 
    super.viewDidLayoutSubviews() 
    self.roomInfoSearchBar.layoutIfNeeded() 
    self.roomInfoSearchBar.layoutSubviews() 

    var roomInfoSearchBarFrame = roomInfoSearchBar.frame 
    var newHeight: CGFloat = 60 //desired textField Height. 
    for subView in roomInfoSearchBar.subviews 
    { 
     for subsubView in subView.subviews 
     { 
     if let textField = subsubView as? UITextField 
     { 
      var currentTextFieldBounds = textField.bounds 
      currentTextFieldBounds.size.height = newHeight 
      textField.bounds = currentTextFieldBounds 
      textField.borderStyle = UITextBorderStyle.RoundedRect 
      //textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight 
     } 
     } 
    } 
    } 

Dzięki Yuyutsu. Dzięki Mahesh za znalezienie ostatecznego rozwiązania od samego początku, po prostu brakuje kilku krytycznych bitów.

+0

Finał może być nawet bardziej wygodne przy użyciu pojęcia Mahesh za dopełnienie. Zasadniczo obliczysz 'newHeight' na podstawie' roomInfoSearchBar.frame' odejmij 2 * somePadding (somePadding jest przestrzenią, którą chcesz pomieścić pomiędzy searchField i textField). Gdy już to ustawisz, możesz po prostu dostosować rozmiar SearchBar w Storyboard, a pole tekstowe również się dostosuje. Musisz tylko zmodyfikować 'viewDidLayoutSubviews()', jeśli chcesz zmienić dopełnienie. – janson

+0

Naprawdę najlepszym rozwiązaniem jest użycie 'UITextField' i dodanie obrazu lupy do' leftView'. Naprawdę, rozwiążesz wiele problemów spowodowanych przez włamywanie się do 'UISearchBar'. – Sulthan

Odpowiedz

12
override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     for subView in searchBars.subviews { 
      for subsubView in subView.subviews { 
       if let textField = subsubView as? UITextField { 
        var bounds: CGRect 
       bounds = textField.frame 
       bounds.size.height = 35 //(set height whatever you want) 
        textField.bounds = bounds 
        textField.borderStyle = UITextBorderStyle.RoundedRect 
//     textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight 
        textField.backgroundColor = UIColor.redColor() 
//     textField.font = UIFont.systemFontOfSize(20) 
       } 
      } 
     } 

    } 

Ta siła pomaga :)

+1

Tak, twój kod zmienia rozmiar samego pola tekstowego, co jest dla mnie wielkim postępem! = D. Domyślam się, że Autolayout robi coś po 'viewDidLoad', ale przed' viewDidAppear'. Jedynym problemem związanym z tą metodą jest to, że widzę zmianę rozmiaru - tzn. Widok ładuje się z wewnętrznym rozmiarem Autolayout, a następnie nagle zmienia się na rozmiar wskazany w "frame.size.height". Próbowałem umieścić go w 'viewWillAppear' tylko po to, aby zobaczyć, ale wtedy pole jest na wewnętrznej wielkości. Innym drobnym problemem, który powinienem był naprawić, jest to, że pole nie jest wyśrodkowane na pasku wyszukiwania. – janson

+0

hej, Zmień 'textfield.bounds' zamiast' frame'. Aktualizuję odpowiedź. daj mi znać, że to działa dobrze dla mnie – Yuyutsu

+0

Zmiana na ograniczenia pomaga, usuwając potrzebę kodu centrującego. Pozostał tylko problem, że zmiana rozmiaru jest widoczna dla użytkownika. Niestety viewDidAppear jest za późno w procesie rysowania ekranu. Nawet w 'willLayoutSubviews' odrysowanie jest nadal widoczne. – janson

2

Możesz zmienić wysokość wewnętrznego pola tekstowego wypróbuj ten kod.

krok 1) ustaw ograniczenie, aby zwiększyć wysokość UISearchBar, a następnie spuść pasek wyszukiwania i zapisz ten kod w kontrolce widoku.

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    [self.searchBar layoutSubviews]; 

    float topPadding = 5.0; 
    for(UIView *view in self.searchBar.subviews) 
    { 
     for(UITextField *textfield in view.subviews) 
     { 
      if ([textfield isKindOfClass:[UITextField class]]) { 
       textfield.frame = CGRectMake(textfield.frame.origin.x, topPadding, textfield.frame.size.width, (self.searchBar.frame.size.height - (topPadding * 2))); 
      } 
     } 
    } 
} 

także jeśli chcesz zmienić cokolwiek innego w pasku wyszukiwania, a następnie można znaleźć dokładny element bazowy jak UILabel, UIImage i UIView wewnątrz UITextFieldsubviews i mogą ulec zmianie Ponadto mogą być one również oznaczone jako inne. Dzięki.

EDIT:

jak prosiłeś w szybkich piszę go w SWIFT. myślę, że próbujesz czegoś złego. spróbuj tego.

func viewDIdLayoutSubviews() 
{ 
    super.viewDidLayoutSubviews() 
    self.roomInfoSearchBar.layoutSubviews() 

    var topPadding: Float = 5.0 
    for view in self.roomInfoSearchBar.subviews as [UIView] 
    { 
     for viewNew in view.subviews as [UIView] 
     { 
      if viewNew.isKindOfClass(UITextField) 
      { 
       viewNew.frame = CGRectMake(viewNew.frame.origin.x, CGFloat(topPadding), viewNew.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2)) 
      } 
     } 
    } 
} 

Użytkownik wykonał widok indeksu 0 jako pierwszy i ostatni widok do zapętlenia. Myślę, że problem, który przetłumaczyłeś, nie zadziałał. Spróbuj raz i odpowiedz.

+0

Próbowałem przetłumaczyć twoją sugestię na szybką. Wydaje mi się, że udało mi się to poprawnie przetłumaczyć, ale pole tekstowe w środku wciąż ma pierwotną wysokość. – janson

+0

zobacz moją zredagowaną odpowiedź i proszę użyć dokładnego kodu, który kiedyś edytowałem. –

+0

Użytkownik podjął self.roomInfoSearchBar.subviews [0], który jest niepoprawny. pole tekstowe może być w dowolnym widoku, który będzie w dowolnym wyglądzie UISearchBar. nie można zakładać, że wchodzenie do widoku na indeksie 0. –

4

Znalazłem przyjętą odpowiedź będzie buggy czasami.
W ten sposób, w jakim rozwiązano kwestię posiadania wysokość niestandardowej do paska wyszukiwania: Mam ustawiony kolorowy obraz o wielkości chcę i dodaje go do textField paska wyszukiwania w viewDidLoad:

let image = getImageWithColor(UIColor.whiteColor(), size: CGSizeMake(600, 60)) 
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal) 

Obserwowani z func ten pochodzi here

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { 
    var rect = CGRectMake(0, 0, size.width, size.height) 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    color.setFill() 
    UIRectFill(rect) 
    var image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 
6

Jeśli używasz:

func setSearchFieldBackgroundImage(backgroundImage: UIImage?, forState state: UIControlState) 

wysokość U Pole UIText ISearchBar będzie takie samo jak wysokość obrazu.

Możesz upuścić obraz, użyć go do dostosowania wysokości UITextfield UISearchar i tła.

Można też skorzystać z poniższego funkcję stworzyć rogiem UIImage:

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { 
    let rect = CGRectMake(0, 0, size.width, size.height) 
    let path = UIBezierPath(roundedRect: rect, cornerRadius: 5.0) 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    color.setFill() 
    path.fill() 
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 

szerokości UIImage jest ignored.But mieć promień narożnika, lepiej większy niż 10.0.

Kod będzie wyglądać następująco:

let image = self.getImageWithColor(UIColor.lightGrayColor(), size: CGSizeMake(20, 20)) 
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal) 
+0

Działa jako urok. Wysokość paska wyszukiwania "kręci" podczas edycji tekstu w poprzednich rozwiązaniach. – djserva

+0

to naprawdę najczystszy i najlepszy sposób na wszystkie odpowiedzi znalezione w sieci. – zero3nna

0

Dodaj wysokość ograniczenie do paska wyszukiwania w serii ujęć widzenia.

Ta migawka ułatwia zrozumienie.

enter image description here

Powiązane problemy