UITextField框架宽度返回太短?

时间:2015-04-08 08:13:27

标签: ios objective-c

我有一个UITextField我正在使用UITextField类别中的以下方法应用底部边框:

-(void)addBottomBorder {
    CALayer *border = [CALayer layer];
    CGFloat borderWidth = 1;

    //  For the sake of visibility
    border.borderColor = [UIColor redColor].CGColor;
    self.backgroundColor = [UIColor whiteColor];

    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, self.frame.size.height);
    border.borderWidth = borderWidth;

    [self.layer addSublayer:border];

    self.layer.masksToBounds = YES;
}

有趣的是,红色底部边框没有跨越文本字段的整个宽度。

这是该行为的屏幕截图。关于可能导致这种情况的任何想法? hmmm?

8 个答案:

答案 0 :(得分:4)

如果您正在使用自动调整大小的掩码,例如灵活的视图宽度,textfield e.t.c,那么您应该根据分辨率和自动调整大小约束成功调整视图大小后添加边框图层。

您的案例中的问题看起来就像您有一个文本字段,您在其上添加了文本字段的当前维度,并且在添加图层后,文本字段会根据自动调整大小约束进行调整大小。但是图层没有根据约束调整大小,并且具有较早的尺寸,导致文本字段和边框图层之间的宽度不同。

要解决此问题,您应在调整文本字段大小后添加边框图层。

或者,在文本字段下方创建一个1像素的UIView,并将其设置为与文本字段相同的水平自动调整掩码。

答案 1 :(得分:2)

那里有很多问题......

  • 如果您的UITextField会调整大小,该怎么办?
  • 如果有leftView / rightView并且它们模糊了底层视图会怎么样?
  • 如果您要添加子视图,则应使用bounds,而不是frame
  • 如果bounds.origin.x != 0怎么办?同样适用于bounds.origin.y

......最简单的方法是做Kristaps推荐的事情。

答案 2 :(得分:1)

创建一个高1p的UIView并在Storyboard中用约束固定到底部和侧面会更容易。根据我的理解,您的问题只发生在屏幕上的textField宽度超过故事板中的大小时,因为textField在添加底线之后会拉伸,因此它不会随着字段一起拉伸。

答案 3 :(得分:0)

设置borderWidth

后尝试设置颜色

答案 4 :(得分:0)

边框的图层被rightView遮挡的问题是什么?您可以尝试以UIView形式添加边框作为文本视图的子视图吗?

答案 5 :(得分:0)

子图层不会自动定位。您没有布置子图层。

不要弄乱文本字段,而是将其包装在装饰视图中并添加背景颜色或底部带有2像素填充的内容。

答案 6 :(得分:0)

只需在setNeedsLayout中添加边框绘制调用,而不是awakeFromNib

然后从视图控制器调用subview的setNeedsLayout来自viewDidLayoutSubviews

如果您有许多子视图需要应用相同的效果,最好将它们全部收集在您将创建的基类中的插座集合中。您将使用此基类继承所有视图控制器,包括自定义文本字段。

@interface FieldsViewController () 

@property (strong, nonatomic) IBOutletCollection(CustomTextField) NSArray *textFields;

@end

@implementation FieldsViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewDidLayoutSubviews {
    for (CustomTextField *textField in self.textFields) {
        [textField setNeedsLayout];
    }
}

@end

答案 7 :(得分:0)

我将我的 addSublayer 移动到 viewDidAppear 而不是 viewDidLoad 并且它工作正常:D