Есть ли способ удалить анимацию значка поиска UISearchBar, который анимируется от центра к левому краю UISearchBar при ответе?

Значок поиска должен отображаться слева вместо центра UISearchBar, и он не должен анимироваться при ответе пользователя.

1
Aman.Samghani 28 Май 2017 в 15:05

2 ответа

Лучший ответ
import Foundation
import UIKit

@objc public class LeftAlignedSearchBar: UISearchBar, UISearchBarDelegate {
    override public var placeholder:String? {
        didSet {
            if #available(iOS 9.0, *) {
                if let text = placeholder {
                    if text.characters.last! != " " {
                        let attr = UITextField.appearanceWhenContainedInInstancesOfClasses([LeftAlignedSearchBar.self]).defaultTextAttributes
                        let maxSize = CGSizeMake(self.bounds.size.width - 86, 40)
                        let widthText = text.boundingRectWithSize( maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width
                        let widthSpace = " ".boundingRectWithSize( maxSize, options: .UsesLineFragmentOrigin, attributes:attr, context:nil).size.width
                        let spaces = floor((maxSize.width - widthText) / widthSpace)
                        let newText = text + ((Array(count: Int(spaces), repeatedValue: " ").joinWithSeparator("")))
                        if newText != text {
                            placeholder = newText
                        }
                    }
                }
            }
        }
    }
}

Источник: https://medium.com/@maximbilan/ios-left- выровнен - uisearchbar - b51ef36b6e1b

0
Rishabh Kohli 30 Май 2017 в 09:41

Исходя из ответа Krennex , я преобразовал его в Swift 3 .

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! != " " {

                        let textField = UITextField.appearance(whenContainedInInstancesOf: [LeftAlignedSearchBar.self])

                        let maxSize = CGSize(width: self.bounds.size.width - 100, height: 40)

                        let widthText = text.boundingRect( with: maxSize, options: .usesLineFragmentOrigin, attributes:textField.defaultTextAttributes, context:nil).size.width

                        let widthSpace = " ".boundingRect( with: maxSize, options: .usesLineFragmentOrigin, attributes:textField.defaultTextAttributes, context:nil).size.width

                        let spaces = floor((maxSize.width - widthText) / widthSpace)

                        let newText = text + ((Array(repeating: " ", count: Int(spaces)).joined(separator: "")))

                        if newText != text {
                            placeholder = "\(newText)"
                        }
                    }
                }
            }
        }
    }
}

Спасибо за ваш ответ Krennex !

0
Patrick Ridd 11 Авг 2017 в 19:33