Как я могу переместить кнопку очистки в UITextField?

По какой-то причине, когда я добавляю UITextfield в качестве подсмотра содержимого контента tablecell, кнопка clearbutton не выравнивается с текстом, введенным в поле, и немного под ним. Есть ли способ переместить текст кнопки очистки, чтобы это не произошло? Спасибо за любую помощь,

Ответ 1

Я этого не видел, и был бы полезен снимок экрана. Но быстрый ответ заключается в том, что вы можете проверить массив subviews UITextField, найти подзаголовок, содержащий кнопку очистки, и настроить его frame.origin.

Изменить: Кажется, я был занижен для этого ответа (написано в 2010 году). Это не "официально" одобренный метод, потому что вы манипулируете частными объектами, но Apple не обнаруживается. Основной риск состоит в том, что иерархия представления может быть изменена в какой-то момент.

Ответ 2

Как указано @Luda, правильный способ заключается в подклассе UITextField и переопределении - (CGRect)clearButtonRectForBounds:(CGRect)bounds. Однако границы, переданные методу, относятся к самому представлению, а не к кнопке. Поэтому вы должны позвонить super, чтобы получить размер предоставленного ОС (чтобы избежать искажения изображения), а затем отрегулировать источник в соответствии с вашими потребностями.

например.

- (CGRect)clearButtonRectForBounds:(CGRect)bounds {
    CGRect originalRect = [super clearButtonRectForBounds:bounds];
    return CGRectOffset(originalRect, -10, 0); //shift the button 10 points to the left
}

Apple docs состояние:

Обсуждение Вы не должны вызывать этот метод напрямую. Если ты хочешь поместите кнопку очистки в другое место, вы можете отменить это метод и вернуть новый прямоугольник. Ваш метод должен вызвать супер реализация и изменение только возвращенных прямоугольников. Изменение размера кнопки очистки может привести к ненужным искажениям изображения кнопки.

Ответ 3

Я подклассифицировал UITextField и переопределить функцию clearButtonRectForBounds:.

.h

#import <UIKit/UIKit.h>

@interface TVUITextFieldWithClearButton : UITextField

@end

ого

#import "TVUITextFieldWithClearButton.h"

@implementation TVUITextFieldWithClearButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)awakeFromNib
{
    self.clearButtonMode = UITextFieldViewModeWhileEditing;
}


- (CGRect)clearButtonRectForBounds:(CGRect)bounds
{
    return CGRectMake(bounds.size.width/2-20 , bounds.origin.y-3, bounds.size.width, bounds.size.height);
}

@end

Ответ 4

Подкласс UITextField и переопределить этот метод:

- (CGRect)clearButtonRectForBounds:(CGRect)bounds
{
    return CGRectMake(bounds.origin.x - 10, bounds.origin.y, bounds.size.width, bounds.size.height);
}

верните CGRect, который соответствует вашим потребностям.

Ответ 5

Версия Swift 4 будет

import UIKit

class LoginTextField: UITextField {

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: xPos, y:yPos, width: yourWidth, height: yourHeight)
    }

}

Ответ 6

Ответ от Ван Ду Тран в Swift 4:

class CustomTextField: UITextField {


override func clearButtonRect(forBounds bounds: CGRect) -> CGRect {
    let originalRect = super.clearButtonRect(forBounds: bounds)

    return originalRect.offsetBy(dx: -8, dy: 0)
}

}

Ответ 7

Свифт 4, 5

Подкласс UITextField (работает отлично, протестировано)

class textFieldWithCrossButtonAdjusted: UITextField {

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect {

        let originalRect = super.clearButtonRect(forBounds: bounds)

        //move 10 points left

        return originalRect.offsetBy(dx: -10, dy: 0)
    }
}