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.
- dostęp do
UITextField
wewnątrzUISearchbar
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.
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
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