iOS: Inifinite Loop устанавливает кадр rightView UITextField с атрибутом IBInspectable

Я наследую свой класс MFTextField от UITextField. Я хочу настроить фрейм свойства rightView UITextField с помощью свойства IBInspectable из Interface Builder. Для этого:

IB_DESIGNABLE
@interface MFTextField : UITextField <UITextFieldDelegate, MFComponentValidationDelegate>

@property (nonatomic) IBInspectable CGRect errorViewFrame;

@end

И в моем MFtextField.m:

-(CGRect)rightViewRectForBounds:(CGRect)bounds {
    if(CGRectEqualToRect(CGRectZero, self.errorViewFrame)) {
        //default position
        CGRect rightViewRect = self.errorView.bounds;
        rightViewRect.size.height = bounds.size.height - 4;
        rightViewRect.origin.y = 2;
        rightViewRect.origin.x = bounds.size.width - rightViewRect.size.width - 2;
        return rightViewRect;
    }
    else {
        //Custom position
        return self.errorViewFrame;
    }
}

Я заявляю о своем правеВид:

self.errorView = [[[NSBundle bundleForClass:[self class]] loadNibNamed:@"MFErrorView" owner:nil options:nil] firstObject];
self.rightView = self.errorView;
self.rightView = UITextFieldViewModeAlways;

Хорошо. Теперь я вижу свой правый вид с позицией по умолчанию в IB, и мне разрешено настраивать его фрейм:

В InterfaceBuilder перед настройкой кадра rightView

Но когда я хочу изменить значение моего свойства IBinspectable кадра просмотра ошибок, XCode начинает бесконечный цикл, а затем падает... Кажется, что метод rightViewRectForBounds: теперь бесконечно вызывается iOS...

Есть идеи ?


person QLag    schedule 14.04.2015    source источник
comment
Вы не указали, где и почему используется метод rightViewRectForBounds, только из вашего кода я могу сказать, что он никогда не вызывается ни вами, ни IB.   -  person A-Live    schedule 14.04.2015
comment
Да, но я забыл указать это в своем вопросе. отредактировано.   -  person QLag    schedule 14.04.2015
comment
Вопрос по-прежнему не показывает, как rightViewRectForBounds предполагается вызываться.   -  person A-Live    schedule 15.04.2015
comment
О да, это так. rightViewRectForBounds — это метод UITextField, который автоматически вызывается при определении rightView.   -  person QLag    schedule 15.04.2015


Ответы (1)


Наконец я нашел, где была проблема. На мой взгляд, это ошибка iOS: ограничения, которые я определил в моем файле XIB, указывают, что «кнопка сведений о информации» должна придерживаться корневого представления XIB (определяя верхнее, левое, нижнее и правое поле между моей кнопкой и корневым представлением xib).

Когда я изменяю первое значение моего свойства IBInspectable (например, я устанавливаю 1 вместо 0 для значения X), размер моего представления слишком мал по сравнению с ограничениями, определенными в XIB, загруженном в rightView: он падает.

Однако, когда я изменяю размер XIB (например, 2x2 вместо 35x35), это не вызывает проблем с его отображением.

Я решил изменить свои ограничения с помощью: фиксированной высоты и фиксированной ширины для моей кнопки «Добавить» (35x35) и центрировать ее по горизонтали и вертикали.

Больше никаких сбоев.

person QLag    schedule 14.04.2015