Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将子视图添加到UITextView并使用自动布局_Ios_Objective C - Fatal编程技术网

Ios 将子视图添加到UITextView并使用自动布局

Ios 将子视图添加到UITextView并使用自动布局,ios,objective-c,Ios,Objective C,我在使用autoLayout将子视图添加到UITextView时遇到问题: 在SubTextView:UITextView.m文件中: - (instancetype)initWithFrame:(CGRect)frame { if(self = [super initWithFrame:frame]) { _baseline = [[UIView alloc] init]; [self addSubview:_baseline]; [s

我在使用autoLayout将子视图添加到UITextView时遇到问题:

在SubTextView:UITextView.m文件中:

 - (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];

}
但是,这不起作用。。。self.baseline的帧始终为(0,0,0,0)。。。 有人能帮忙吗

编辑: 我在layout子视图处设置了一个断点,此时,当LayoutSubView初始化子视图时,UITextView为:

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

但基线的框架是:

<UIView: 0x7fd92cb90710; 
frame = (0 -10; 399 0.5);
layer = <CALayer: 0x7fd92cb907e0>>. 
不知道如何使y=-10到y=69.7

我觉得它有点像scrollView,我通过在UIScrollView上添加一个UIView作为contentView来解决这个问题,而UIScrollView本身被添加到另一个UIView上。然后我将contentView的顶部设置为scrollView的顶部,contentView的高度,以及!!!(这很重要,否则自动布局将无法正常工作)

contentView的左视图和右视图是UIView,而不是scrollView。 但我不认为它适用于UITextView

任何人都可以提供帮助?

帧将始终为(0,0,0,0),因为这是
[[UIView alloc]init]
附带的默认帧

您是否尝试过将视图设置为框架

- (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];
    }
}
如果这样做有效,那么我们就发现了问题,如果没有,那么问题可能出在
-(void)updateConstraints
方法上

更新:

所以,我坐下来运行了你的代码,我遇到了一些崩溃,但最终我成功地使文本视图中的黑框变成了apear。我发现当视图要布局它的子视图时,框没有实例化,所以我修改了一下,这里是这样的,它会抛出一些约束警告,但是我想你可以自己处理这些

- (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];

    }
}

您应该使用UIView addsubview UITextView和self.Baseline,但我也有一个要添加到UITextView的清除按钮,因此我想看看是否有某种方法可以将子视图添加到UITextView并自动布局它?我想您需要添加约束宽度高度中心x中心,不需要添加前导尾随-centerX centerYIt也不起作用…我使用[[UIView alloc]init]的原因是我想使用自动布局而不是静态框架来完成。通常,框架应该由-updateConstraints中定义的NSLayoutConstraints设置,它通过[self-setNeedsUpdateConstraints]调用。通过它,当视图按-(void)layoutSubviews布局时,其子视图的框架将相应地设置。我知道设置框架可以直接工作,但我不知道如何通过自动布局使其工作。顺便说一下,我想知道为什么我的视图没有被实例化,这是因为我将子类分配给IB上的UITextView,所以调用的init方法不是
initWithFrame
,而是
initWithCoder:
。也许这就是区别所在,不管怎样,我所发布的内容都是有效的,无论您是将视图放在IB上还是以编程方式实例化它。Thx!让我先试试。嗨,你能添加translatesAutoresizingMaskIntoConstraints=NO并试试吗。我假设框显示不是由autoLayout引起的,而是由autoResizingI测试引起的,当layoutSubviews子视图被初始化时,UITextView是:,但基线的框架是:。不知道如何使y=-10到y=69.7。