По какой-то причине, когда я добавляю UITextfield в качестве подсмотра содержимого контента tablecell, кнопка clearbutton не выравнивается с текстом, введенным в поле, и немного под ним. Есть ли способ переместить текст кнопки очистки, чтобы это не произошло? Спасибо за любую помощь,
Как я могу переместить кнопку очистки в UITextField?
Ответ 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)
}
}