ios自动布局-调整第一视图大小时移动第二视图

ios自动布局-调整第一视图大小时移动第二视图,ios,objective-c,autolayout,constraints,Ios,Objective C,Autolayout,Constraints,我的主视图由一个滚动视图组成,其中有几个文本字段作为表单的一部分。 然后我有一个文本视图,实际上是一个HPGrowingTextView,它在添加文本/行时垂直调整文本视图的大小。 此文本视图下面是一个mkmapview。 自动布局对于初始布局效果良好,但是当textview调整自身大小时,地图视图不会移动。您可以在屏幕截图中看到textview的边框如何消失在地图视图后面,而地图视图仍在其原始位置 mapview的TopSpace约束在GrowthingTextView.Bottom中设置为8

我的主视图由一个滚动视图组成,其中有几个文本字段作为表单的一部分。 然后我有一个文本视图,实际上是一个HPGrowingTextView,它在添加文本/行时垂直调整文本视图的大小。 此文本视图下面是一个mkmapview。 自动布局对于初始布局效果良好,但是当textview调整自身大小时,地图视图不会移动。您可以在屏幕截图中看到textview的边框如何消失在地图视图后面,而地图视图仍在其原始位置

mapview的TopSpace约束在GrowthingTextView.Bottom中设置为8,所以我认为它应该在任何时候都自动保持8像素或其他距离

我正在使用故事板。。。GrowthingTextView是在故事板上拖入的UIView,设置/子类为HPGrowthingTextView。 除了地图视图不移动之外。。。在没有mapview的情况下,它可以正常工作

似乎与自动布局不兼容。它没有实现-intrinsicContentSize。它也没有添加任何约束。相反,它只是设置了自己的框架

在自动布局中,设置帧无效。您必须调整约束。更改其内在内容大小的视图具有调整系统隐式创建的某些约束的效果。对框架的任何更改都将在下一个布局过程中撤消

坦率地说,我有点惊讶于最初的布局是合理的。HPGrowthTextView没有固有大小,您是否有高度限制或其他补偿措施


无论如何,您需要切换到自动布局感知视图或修复HPGrowthingTextView。

如果您不寻求其他功能,那么只需使用标准UITextView就相当容易了

插入UITextView,并添加常用的自动布局约束。在我的示例中,我有几个UITextFields,然后是我的UITextView,后面是一个MKMapView。每个项目都被限制在上一个项目下方8处。请参阅原始帖子中的屏幕截图。像往常一样为UITextView创建IBOutlet。不要忘记遵守UITextViewDelegate。 在class/view的.h文件中添加插座,以便在需要时设置/更改高度约束。在情节提要中,alt单击UITextView的高度约束,并将其连接到.h文件中的IBOutlet。 @属性非原子,强IBN布局约束*高度约束

将以下方法添加到.m文件中

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
    // if the text has updated, resize the view accordingly
    [self resizeTextViewToFitContent:textView];
    return YES;
}

- (void)resizeTextViewToFitContent:(UITextView *)textView {
    CGRect frame = textView.frame;
    frame.size.height=[self heightOfTextView:textView];
    textView.frame=frame;
}

-(CGFloat)heightOfTextView:(UITextView *)textView {
    // because i've set a minimum height for the textview 
    // (which is the same as the height i set in the Storyboard/constraints, 
    // set the new size to whatever is larger 
    // - the required size or the minimum size.
    CGFloat val = MAX(_minTextViewHeight,self.addressTextView.intrinsicContentSize.height);
    return val;
}

-(IBAction)textViewDidChange:(UITextView *)textView {
    // update the constraint based on the size we expect the view to be.
    // because this is an IBOutlet, it then updates on the screen.
    self.heightConstraint.constant = [self heightOfTextView:self.addressTextView];
 }

在调整textview大小的同时,保持对mkmapview的约束,这对我来说似乎是完美无瑕的。地图视图现在随着文本视图的增大/缩小而向下或向上移动:-

谢谢Ken。在尝试了其他一些自定义UITextView之后,我从不同的地方拼凑了一些解决方案/建议。我95%的方法都是使用标准的UITextView。见下面的答案。