Damon Yuan
Damon Yuan

Reputation: 3803

Add subview to UITextView and using autolayout

I have problem with adding subview to UITextView using autoLayout:

in SubTextView : UITextView .m file:

 - (instancetype)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]) {
        _baseline = [[UIView alloc] init];
        [self addSubview:_baseline];
        [self setBackgroundColor: [UIColor blackColor]];
        _baseline.translatesAutoresizingMaskIntoConstraints = NO;
        [self setNeedsUpdateConstraints];
    }
}
- (void)updateConstraints
{
    [super updateConstraints];
    NSLayoutConstraint *constraint = nil;
    constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                          attribute:NSLayoutAttributeTrailing
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:self
                                          attribute:NSLayoutAttributeTrailing
                                         multiplier:1.f
                                           constant:0.f];
[self addConstraint:constraint];

constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                          attribute:NSLayoutAttributeLeading
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:self
                                          attribute:NSLayoutAttributeLeading
                                         multiplier:1.f
                                           constant:0.f];
[self addConstraint:constraint];

constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                          attribute:NSLayoutAttributeCenterY
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:self
                                          attribute:NSLayoutAttributeCenterY
                                         multiplier:1.f
                                           constant:0.f];
[self addConstraint:constraint];

}

But, this do not work... the self.baseline's frame is always (0, 0, 0, 0)... Anyone can help?

Edited:

I set a break point at layout subviews, at that time, when layoutSubviews the subviews are inited, and the UITextView is :

<InventoryOverviewListingNameTextView: 0x7fd92b2a1800; 
baseClass = UITextView; 
frame = (234 36; 399 70.2); 
text = '11111111'; 
clipsToBounds = YES; 
gestureRecognizers = <NSArray: 0x7fd92cbd8ca0>; 
layer = <CALayer: 0x7fd92cb08900>; 
contentOffset: {-0, 10}; 
contentSize: {399, 70.199997425079346}>

But the frame of the baseline is:

<UIView: 0x7fd92cb90710; 
frame = (0 -10; 399 0.5);
layer = <CALayer: 0x7fd92cb907e0>>. 

Do not know how to make the y = -10 to y = 69.7.

I feel it is a little like scrollView, to which I solve by add a UIView as contentView on UIScrollView, and UIScrollView itself is added on another UIView. Then I set the contentView's top to scrollView's top, contentView's heigh, and !!!(this is important or autoLayout won't work properly)

contentView's left and right to UIView rather than scrollView.

But I do not see it works for UITextView...

Anyone can help?

Upvotes: 2

Views: 3977

Answers (1)

MikePT28
MikePT28

Reputation: 51

The frame will always be (0,0,0,0) because that is the default one that comes whit [[UIView alloc] init].

Have you tried defining the view setting a frame?

- (instancetype)initWithFrame:(CGRect)frame
{
    if(self = [super initWithFrame:frame]) {
        //Add a frame, does not matter the size
        _baseline = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];

        //Just to make sure it's there let us give it a color
        [_baseline setBackgroundColor:[UIColor green]];

        [self addSubview:_baseline];

        //Don't run this line just yet.
        //[self setNeedsUpdateConstraints];
    }
}

If that works, then we found the problem, if it does not, maybe the problem is on the - (void)updateConstraints method.

UPDATE:

So, I sat down and ran your code, I got a few crashes but eventually I managed to make the black box apear inside the text view. I found that the box was not instantiated when the view was looking to layout its subviews, so I tinkered around and here goes, this works, it throws a few constraints warnings but I guess you can work those by yourself.

- (instancetype)initWithFrame:(CGRect)frame
    {
        if(self = [super initWithFrame:frame]) {
        }

        return self;
    }

-(void)layoutSubviews{
        [super layoutSubviews];
        if (!_baseline) {
            _baseline = [[UIView alloc] init];
            [self addSubview:_baseline];
            [self setBackgroundColor: [UIColor blackColor]];
            [self setNeedsUpdateConstraints];
        }

    }

- (void)updateConstraints {
    [super updateConstraints];
    if (_baseline) {
        NSLayoutConstraint *constraint = nil;
            constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                                      attribute:NSLayoutAttributeTrailing
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self
                                                      attribute:NSLayoutAttributeTrailing
                                                     multiplier:1.f
                                                       constant:0.f];
            [self addConstraint:constraint];

            constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                                      attribute:NSLayoutAttributeLeading
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self
                                                      attribute:NSLayoutAttributeLeading
                                                     multiplier:1.f
                                                       constant:0.f];
            [self addConstraint:constraint];

            constraint = [NSLayoutConstraint constraintWithItem:self.baseline
                                                      attribute:NSLayoutAttributeCenterY
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self
                                                      attribute:NSLayoutAttributeCenterY
                                                     multiplier:1.f
                                                       constant:0.f];
            [self addConstraint:constraint];

    }
}

Upvotes: 1

Related Questions