Настройка фонового изображения поля поиска UISearchBar изменяет заполнение

Когда я устанавливаю фоновое изображение поля поиска на UIImage, отступ между увеличительным стеклом и текстом-заполнителем в строке поиска при выборе изменяется.

С фоном по умолчанию:

Хорошее дополнение

С пользовательским фоном:

Плохое заполнение

Это изменение вызвано этими двумя строками:

UIImage *colorImage = [UIImage imageWithColor:[UIColor grayColor] size:CGSizeMake(28, 28)];
[self setSearchFieldBackgroundImage:[colorImage imageWithRoundedCorners:5] forState:UIControlStateNormal];

imageWithRoundedCorners: — это метод категории, который просто рисует изображение на CALayer с радиусом угла, а затем создает UIImage из графического контекста.

Почему это и как этого избежать? Я попытался передать изображение с явно изменяемым размером, но это не дало никакого эффекта.


person pr1001    schedule 18.11.2014    source источник


Ответы (3)


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

[self.searchBar setSearchFieldBackgroundImage:[self imageWithColor:[UIColor grayColor] andSize:CGSizeMake(28.0, 28.0)] forState:UIControlStateNormal];
[self.searchBar setSearchTextPositionAdjustment:UIOffsetMake(8.0, 0.0)];

введите здесь описание изображения

person Ryan Poolos    schedule 21.11.2014
comment
Также вы можете захотеть зарегистрировать радар, потому что я бы сказал, что сброс фоновых изображений - это своего рода ошибка. - person Ryan Poolos; 21.11.2014
comment
Я заметил, что в области острого угла есть другой цвет, как его удалить? - person Happiehappie; 21.03.2016

Для всех, кто сейчас использует Swift, вы можете использовать следующий код (работает в Swift 2)

let searchBarBackground = UIImage.roundedImage(UIImage.imageWithColor(UIColor.whiteColor(), size: CGSize(width: 28, height: 28)),cornerRadius: 2)
searchBar.setSearchFieldBackgroundImage(searchBarBackground, forState: .Normal)
searchBar.searchTextPositionAdjustment = UIOffsetMake(8.0, 0.0)

Используйте это с расширением UIImage:

extension UIImage {
     class func imageWithColor(color: UIColor, size: CGSize) -> UIImage {
        let rect: CGRect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    class func roundedImage(image: UIImage, cornerRadius: Int) -> UIImage {
        let rect = CGRect(origin:CGPoint(x: 0, y: 0), size: image.size)
        UIGraphicsBeginImageContextWithOptions(image.size, false, 1)
        UIBezierPath(
            roundedRect: rect,
            cornerRadius: CGFloat(cornerRadius)
        ).addClip()
        image.drawInRect(rect)
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

Чтобы дать что-то похожее на это:

введите описание изображения здесь

person Ben    schedule 23.12.2015

Обновленное решение для Swift 4

searchTextPositionAdjustment = UIOffset(horizontal: 8.0, vertical: 0.0)
person Edouard Barbier    schedule 21.09.2018