Storyboard 元素与使用 Objective-C 和 Swift 以编程方式创建的 UI 元素的自动布局交互

问题描述 投票:0回答:1

因为我有一个非常复杂的故事板,我认为以编程方式添加条件元素是个好主意。特别是,如果故事板中 UILabel 的文本太大,我想将文本放置在具有固定高度的可滚动 UITextView 中。 标签设置为 0 行,因此它会垂直扩展。然而,对于长文本,要么必须截断,要么标签变得太大,因为它不可滚动。

问题是当我以编程方式将textView添加到viewController时,自动布局约束对textView一无所知并且不进行调整。

我是否有必要使用插座手动调整所有约束,或者任何人都可以建议一种方法来让 UI 元素自动调整为以编程方式添加 UITextView 来代替 UILabel。 现在,我将 UITextView 添加为 VC 的整体 contentView 的子视图。我是否应该将其添加为标签的子视图? 如有任何建议,我将不胜感激。

这是迄今为止我的代码:

if (mytext.length >= 32) {
         [self swapTextviewWith:mytext];//create a textview and put in the textview
    }
    else {
        self.messageLabel.text = mytext;//put in label
       
    }

-(void) swapTextviewWith: (NSString*) text {
    UITextView * tv = [UITextView new];
    CGRect aFrame = self.messageLabel.frame;
    aFrame.size.height = 100;
    tv.frame = aFrame;
    self.messageLabel.hidden = YES;
    [self.contentView addSubview: tv];
    tv.text = text;
    UIFont *font=[UIFont fontWithName:@"Arial" size:16.f];
    tv.font = font;
    [tv setNeedsDisplay];
}
ios autolayout storyboard constraints uitextview
1个回答
0
投票

让一些子视图来自故事板而其他子视图来自代码绝对没有问题。我可以想到该问题的其他解决方案(例如,使两个视图可交换的一种简单方法是使它们都排列为堆栈视图的子视图,然后隐藏其中一个或另一个),但让我们谈谈好像这样的方式你提议这就是你要做的事情。

我是否有必要使用outlet手动调整所有约束

是的。将文本视图的

translatesAutoresizingMaskIntoConstraints
设置为
false
并根据需要在其与其他视图之间添加约束(显然,您需要对这些视图的引用才能执行此操作,并且这些引用当然可以来自 Outlet)。

请注意,您的代码将

messageLabel
留在原处(尽管不可见),因此如果情节提要中对其存在约束,这些约束仍然存在。在正常情况下(即not在堆栈视图中),隐藏视图仍然是界面中的视图,并且对其的约束仍然有效。因此,您可能还需要对这些视图的引用,以便可以停用它们;否则,您可能会遇到约束冲突,并且内容将无法正确显示。另一方面,在我看来,您可以简单地将文本视图固定到所有四个边上的
messageLabel
,然后继续为
messageLabel
提供绝对高度约束。

© www.soinside.com 2019 - 2024. All rights reserved.