约束不适用于UITextView

时间:2014-04-23 00:11:57

标签: ios objective-c uitextview constraints

我有一个View控制器,其中视图有两个图像视图和两个文本视图。我关闭了自动布局,并使用以下代码以编程方式设置第一个文本视图和第一个图像视图之间的距离: 以下代码位于我的自定义视图控制器类的viewDidLoad方法中。我在两种情况下都将自动调整遮罩设置为否,因此我不知道代码为什么不起作用。 (tf2_logo是图像视图,itemName是文本视图)

self.tf2_logo.translatesAutoresizingMaskIntoConstraints = NO;
[self.backpackBackground addConstraint:[NSLayoutConstraint constraintWithItem:self.itemName attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.tf2_logo attribute:NSLayoutAttributeTop multiplier:1.0 constant:-1.0]];
[self.backpackBackground addConstraint:[NSLayoutConstraint constraintWithItem:self.tf2_logo attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.backpackBackground attribute:NSLayoutAttributeLeft multiplier:1.0 constant:17]];

现在我想用我的其他文本视图做同样的事情,基本上我想保持itemName文本视图和文本视图之间的距离在一定距离。我用过这段代码: (tf2是我的另一个文本视图)

self.tf2.translatesAutoresizingMaskIntoConstraints = NO;
[self.backpackBackground addConstraint:[NSLayoutConstraint constraintWithItem:self.itemName attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.tf2 attribute:NSLayoutAttributeTop multiplier:1.0 constant:-3.0]];
[self.backpackBackground addConstraint:[NSLayoutConstraint constraintWithItem:self.tf2 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.tf2_logo attribute:NSLayoutAttributeRight multiplier:1.0 constant:20]];

实现此代码后,tf2文本视图甚至不会显示在视图控制器中。有什么问题?

编辑:您可以在此处下载整个项目:https://www.dropbox.com/sh/u820u2ndyrncuz8/P4atI-9CAx

2 个答案:

答案 0 :(得分:2)

编辑#2: 你提到你关闭了自动布局,因为UITextView在iOS7中有一点点差距。要消除差距,请尝试以下方法:

self.tf1.textContainerInset = UIEdgeInsetsZero;

当您记录textContainerInset的原始值时,它会显示:{8, 0, 8, 0}。两个8负责差距(一个在顶部)。上面的行将所有值设置为零,并且内容很好地与帧的顶部对齐。

(编辑#1:完全改变了答案)

我假设您主要希望拥有imageName UITextView的灵活高度。首先我建议使用自动布局。您可以根据以下图像在Xcode中设置约束:

Constraints

红线是约束。绿线是特殊的:它应该是一个高度约束,您可以在视图控制器中为它创建一个出口。 (打开文档大纲视图,在树中找到高度约束并控制 - 将其拖到代码中。)

然后在viewDidLoad方法中:

CGSize size = [self.tf1 sizeThatFits:self.tf1.frame.size];
self.tf1Height.constant = size.height;

" lore ipsum"字段现在调整其内容。

Screenshot

答案 1 :(得分:-3)

您是否尝试使用框架而不是约束?如果您不使用自动布局我认为框架可能更容易阅读/实施。

样品:

// tf2 will be placed at (0,0) in superview and have width of 100 and height of 20

tf2.frame = CGRectMake(0, 0, 100, 20); 

您可以使用不同的值来根据需要进行布局。