2013-12-04 2 views
13

This is the searchbar that the designers want me to createКак выравнивание по левому краю UISearchBar замещающий текст

мне нужно сделать заказ строку поиска, как это. Проблема, с которой я столкнулась, - это выровнять текст заполнителя, а также поместить значок поиска справа. У меня есть png значка поиска, который я пытался использовать в UIImageView, и установил UIImageView как rightViewUISearchBarUITextField. Это решение не сработало, и у меня кончились идеи. у кого-нибудь есть решение?

+0

Не уверен в выравнивании текста, но вы можете подумать о том, чтобы сделать значок поиска в пользовательский 'UIButton', расположенный поверх строки поиска, который функционирует как кнопка« Ввод ». Я столкнулся с несколькими приложениями, которые это делают, и мне всегда нравилось иметь возможность не использовать поле поиска, открывать клавиатуру и удалять «Поиск» там, если я хочу повторно запустить поиск , – Nerrolken

+0

Я ответил на этот вопрос по другому вопросу. Приятно получать отзывы о том, как его улучшить: http://stackoverflow.com/a/25827025/3746156 – bdv

ответ

12

Не используйте UISearchBar, если вам нужно выполнить эти настройки. Вы должны будете сделать свой собственный, используя UITextField и UIImageView, и отвечать на вызовы делегата.

+0

Но обратите внимание, что UISearchController, похоже, требует использования реального UISearchBar или подкласса. –

+2

Но я хочу, чтобы все другие встроенные функции панели поиска (например, отмена и кнопка x) - я просто хочу, чтобы выровнять текст заполнителя - это слишком много, чтобы спросить? И почему это так сложно сделать? – jbyrd

0

Если вы хотите, чтобы ваш контроль отвечал точно так, как вы хотите, вы должны, вероятно, создать свой собственный пользовательский элемент управления. Этот контроль может быть разделены на три части:

  1. фоне UIImageView
  2. UITextField
  3. UIButton для иконе поиска, если вы хотите, чтобы пользователь взаимодействовать с ним

Самый простой способ сделать это, вероятно, создать новый класс MySearchBar с тремя частями в частном интерфейсе:

В вашем MySearchBar вы можете создать свой компонент, настроить его, добавить более качественный вид &. Чтобы вернуть результат поиска, ваш элемент управления может иметь делегат id<UISearchBarDelegate> (ваш UIViewController), который будет в основном имитировать наличие стандартного UISearchBar.

Осталось создать ваш MySearchBar в контроллере и установить делегат в контроллер вашего вида. Сообщения от UISearchBarDelegate могут отправиться на ваш MySearchBar, чтобы отфильтровать или выполнить предварительную обработку перед отправкой на ваш UIViewController, или перейдите непосредственно к UIViewController.

+0

Спасибо за подробный ответ, я обязательно буду использовать это. –

0

Нет необходимости какой-либо настройки просто это сделать ...

[email protected]"Search              "; 

Searchbar имеет centeral выравнивание текста для места его Hoder, так что просто дать некоторые большой текст. и если текст небольшой, то просто используйте пробел после текста места.

+3

если кто-то голосует любой ответ. сначала отправьте правильный ответ. –

+1

Это работает безупречно, только если вы проверите количество пробелов, которые вам нужны, и добавьте их динамически. - переопределяет местозаполнитель var и проверяет размер текста снова на размер контроллера, чем размер одного пробела. Если кто-то хочет, чтобы я опубликовал код, дайте мне знать. –

+0

@drix было бы здорово, если бы вы могли опубликовать этот код? – DevC

2

Основанный в Mohittomar ответ, как и попросил @DevC добавить пробелы в конце держателя места, то здесь код в стрижа:

I подкласс заполнитель в UISearchBar, после установки значения, я проверяю последний символ - это пробел. затем получите размер одного пробела и количество пробелов, которые нужно добавить для выравнивания влево.

class SearchBar: UISearchBar, UISearchBarDelegate { 
override var placeholder:String? { 
    didSet { 
     if let text = placeholder { 
      if text.last != " " { 

// get the font attribute 
       let attr = UITextField.s_appearanceWhenContainedIn(SearchBar).defaultTextAttributes 
// define a max size 
       let maxSize = CGSizeMake(UIScreen.mainScreen().bounds.size.width - 60, 40) 
// get the size of the text 
       var widthText = text.boundingRectWithSize(maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width 
// get the size of one space 
       var widthSpace = " ".boundingRectWithSize(maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width 
       let spaces = floor((maxSize.width - widthText)/widthSpace) 
// add the spaces 
       let newText = text + (" " * spaces) 
// apply the new text if nescessary 
       if newText != text { 
        placeholder = newText 
       } 
      } 
     } 
    } 
} 
2

Рабочий раствор для Drix ответа

import Foundation 
import UIKit 

class LeftAlignedSearchBar: UISearchBar, UISearchBarDelegate { 
    override var placeholder:String? { 
     didSet { 
      if #available(iOS 9.0, *) { 
       if let text = placeholder { 
        if text.characters.last! != " " { 
         // get the font attribute 
         let attr = UITextField.appearanceWhenContainedInInstancesOfClasses([LeftAlignedSearchBar.self]).defaultTextAttributes 
         // define a max size 
         let maxSize = CGSizeMake(UIScreen.mainScreen().bounds.size.width - 87, 40) 
//      let maxSize = CGSizeMake(self.bounds.size.width - 92, 40) 
         // get the size of the text 
         let widthText = text.boundingRectWithSize(maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width 
         // get the size of one space 
         let widthSpace = " ".boundingRectWithSize(maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width 
         let spaces = floor((maxSize.width - widthText)/widthSpace) 
         // add the spaces 
         let newText = text + ((Array(count: Int(spaces), repeatedValue: " ").joinWithSeparator(""))) 
         // apply the new text if nescessary 
         if newText != text { 
          placeholder = newText 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Этого метод appearanceWhenContainedInInstancesOfClasses не доступен в прошивке 8, есть обходной путь для прошивки 8 here

-2

Это слишком поздно, но если кто-то все еще задаваясь вопросом о решении, вы можете следовать этому.

UITextField *searchTextField = [searchBarController.searchBar valueForKey:@"_searchField"]; 

Вы можете получить поле поиска, используя вышеуказанный код. Теперь просто используйте свойства, которые вы хотите использовать, например.

searchTextField.layer.cornerRadius = 10.0f; 
searchTextField.textAlignment = NSTextAlignmentLeft; 

PS. Свойство выравнивания текста используется для текста и заполнителя. Спасибо.

+1

Быстрый эквивалент для этого не работает. – mattgabor

2

СВИФТ 3

скоро 3 не позволяет переопределить замещающее свойство. Это модифицированная версия ответа Drix.

func setPlaceHolder(placeholder: String)-> String 
    { 

     var text = placeholder 
      if text.characters.last! != " " { 

       //       define a max size 

       let maxSize = CGSize(width: UIScreen.main.bounds.size.width - 97, height: 40) 

       //      let maxSize = CGSizeMake(self.bounds.size.width - 92, 40) 
       // get the size of the text 
       let widthText = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes:nil, context:nil).size.width 
       // get the size of one space 
       let widthSpace = " ".boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes:nil, context:nil).size.width 
       let spaces = floor((maxSize.width - widthText)/widthSpace) 
       // add the spaces 
       let newText = text + ((Array(repeating: " ", count: Int(spaces)).joined(separator: ""))) 
       // apply the new text if nescessary 
       if newText != text { 
        return newText 
       } 

      } 

     return placeholder; 
    } 

и вызов функции, как:

searchBar.placeholder = self.setPlaceHolder(placeholder: "your placeholder text"); 
0

Версия для Xamarin

SearchBar.MovePlaceHolderLeft(); 

public static void MovePlaceHolderLeft(this UISearchBar searchbar) 
{ 
    NSAttributedString text = new NSAttributedString(searchbar.Placeholder ?? ""); 
    // define a max size 
    var maxSize = new CGSize(width: UIScreen.MainScreen.Bounds.Size.Width - 97, height: 40); 
    // get the size of the text 
    var widthText = text.GetBoundingRect(maxSize, NSStringDrawingOptions.UsesLineFragmentOrigin, null).Size.Width; 
    // get the size of one space 
    var widthSpace = new NSAttributedString(" ").GetBoundingRect(maxSize, NSStringDrawingOptions.UsesLineFragmentOrigin, null).Size.Width; 
    var spaces = Math.Floor((maxSize.Width - widthText)/widthSpace); 
    // add the spaces 
    string newText = searchbar.Placeholder; 
    for (double i = 0; i < spaces; i++) 
    { 
     newText += " "; 
    } 
    searchbar.Placeholder = newText; 
} 
2

Работающий скор 3 решение для Drix ответа:

import Foundation 
    import UIKit 

    class LeftAlignedSearchBar: UISearchBar, UISearchBarDelegate { 
     override var placeholder:String? { 
      didSet { 
       if #available(iOS 9.0, *) { 

        if let text = placeholder { 
         if text.characters.last! != " " { 
          // get the font attribute 
          let attr = UITextField.appearance(whenContainedInInstancesOf: [LeftAlignedSearchBar.self]).defaultTextAttributes 
          // define a max size 
          let maxSize = CGSize(width: UIScreen.main.bounds.size.width - 87, height: 40) 
          // let maxSize = CGSize(width:self.bounds.size.width - 92,height: 40) 
          // get the size of the text 
          let widthText = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes:attr, context:nil).size.width 
          // get the size of one space 
          let widthSpace = " ".boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes:attr, context:nil).size.width 
          let spaces = floor((maxSize.width - widthText)/widthSpace) 
          // add the spaces 
          let newText = text + ((Array(repeating: " ", count: Int(spaces)).joined(separator: ""))) 
          // apply the new text if nescessary 
          if newText != text { 
           placeholder = newText 
          } 
         } 
        } 
       } 
      } 
     } 

     /* 
     // Only override draw() if you perform custom drawing. 
     // An empty implementation adversely affects performance during animation. 
     override func draw(_ rect: CGRect) { 
      // Drawing code 
     } 
     */ 

    } 
Смежные вопросы