Ios 将子视图添加到UITextView并使用自动布局
我在使用autoLayout将子视图添加到UITextView时遇到问题: 在SubTextView:UITextView.m文件中: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
- (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。