0

我从 UITextField 继承了我的“MFTextField”类。我想使用 Interface Builder 中的 IBInspectable 属性自定义 UITextField 的“rightView”属性的框架。要做到这一点 :

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;
    }
}

我声明我的 rightView :

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

好的。现在我在 IB 上看到了我的 rightView 默认位置,我可以自定义它的框架:

在InterfaceBuilder之前自定义rightView框架

但是当我想更改我的“错误视图框架”IBinspectable 属性的值时,XCode 开始一个无限循环然后崩溃......似乎方法rightViewRectForBounds:现在被 iOS 无限调用......

任何想法 ?

4

1 回答 1

0

最后我发现问题出在哪里。在我看来,这是一个 iOS 错误:我在我的 XIB 文件中定义的约束指定“信息详细信息按钮”必须粘贴 XIB 根视图(定义我的按钮和 XIB 根视图之间的顶部、左侧、底部和右侧边距)。

当我更改 IBInspectable 属性的第一个值时(例如,我将 X 值设置为 1 而不是 0),与在 rightView 中加载的 XIB 中定义的约束相比,我的视图的大小很小:它崩溃了。

但是,当我更改 XIB 大小(例如 2x2 而不是 35x35)时,渲染它不会出现问题。

我决定改变我的约束:我的添加按钮(35x35)的固定高度和固定宽度并将其水平和垂直居中。

没有崩溃了。

于 2015-04-14T14:46:58.873 回答