iOS : 无限循环设置带有 IBInspectable 属性的 UITextField 的 rightView 框架
iOS : Inifinite Loop setting rightView's frame of UITextField with IBInspectable attribute
我从 UITextField 继承了我的“MFTextField”class。
我想使用 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;
好的。现在我看到我的 rightView 在 IB 上有默认位置,我可以自定义它的框架 :
但是当我想更改我的“错误视图框架”IBinspectable 属性 的值时,XCode 开始无限循环然后崩溃...似乎方法 rightViewRectForBounds: 现在被 iOS 无限调用...
有什么想法吗?
终于找到问题出在哪里了。在我看来,这是一个 iOS 错误:
我在我的 XIB 文件中定义的约束指定 "Info Detail Button" 必须粘贴 XIB rootView(在我的按钮和 xib 根视图之间定义顶部、左侧、底部和右侧边距)。
当我更改 IBInspectable 的第一个值时 属性(例如,我将 X 值设置为 1 而不是 0),与 XIB 中定义的约束相比,我的视图尺寸太小在 rightView 中加载:它崩溃了。
但是,当我更改 XIB 大小时(例如 2x2 而不是 35x35),渲染它不会有任何问题。
我决定更改我的约束:添加按钮 (35x35) 的固定高度和固定宽度,并将其水平和垂直居中。
不再崩溃。
我从 UITextField 继承了我的“MFTextField”class。 我想使用 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;
好的。现在我看到我的 rightView 在 IB 上有默认位置,我可以自定义它的框架 :
但是当我想更改我的“错误视图框架”IBinspectable 属性 的值时,XCode 开始无限循环然后崩溃...似乎方法 rightViewRectForBounds: 现在被 iOS 无限调用...
有什么想法吗?
终于找到问题出在哪里了。在我看来,这是一个 iOS 错误: 我在我的 XIB 文件中定义的约束指定 "Info Detail Button" 必须粘贴 XIB rootView(在我的按钮和 xib 根视图之间定义顶部、左侧、底部和右侧边距)。
当我更改 IBInspectable 的第一个值时 属性(例如,我将 X 值设置为 1 而不是 0),与 XIB 中定义的约束相比,我的视图尺寸太小在 rightView 中加载:它崩溃了。
但是,当我更改 XIB 大小时(例如 2x2 而不是 35x35),渲染它不会有任何问题。
我决定更改我的约束:添加按钮 (35x35) 的固定高度和固定宽度,并将其水平和垂直居中。
不再崩溃。