ios Autolayout - 在第一个视图调整大小时移动第二个视图

时间:2015-03-28 05:29:57

标签: ios objective-c autolayout constraints

我的主视图包含一个滚动视图,其中有几个文本字段作为表单的一部分。 然后我有一个textView(实际上是一个HPGrowingTextView),它在添加文本/行时垂直调整textview的大小。 在这个textview下面是一个mkmapview。 Autolayout适用于初始布局,但是当textview自行调整大小时,mapview不会移动(您可以在屏幕截图中看到textview的边框是如何在mapview后面消失的,仍然在其原始位置

mapview的TopSpace约束从GrowingTextView.Bottom设置为8,所以我认为它应该始终从textview中自动保留8个像素(或其他任何值)。

(我正在使用Storyboards ... GrowingTextView是一个在故事板上拖入的UIView,并设置/子类化为HPGrowingTextView。 除了mapview没有移动...它正常工作(没有mapview测试)

2 个答案:

答案 0 :(得分:2)

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

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

坦率地说,我对初始布局合情合理感到有些惊讶。你有高度限制或其他东西来弥补HPGrowingTextView没有内在大小的事实吗?

无论如何,您需要切换到支持自动布局的视图或修复HPGrowingTextView

答案 1 :(得分:2)

如果您不想寻找其他功能,那么使用标准的UITextView会相当容易。

  1. 插入UITextView,并添加常用的自动布局约束。在我的例子中,我有一些UITextFields,然后是我的UITextView,然后是MKMapView。每个都被限制在前一项下面8。 (见原帖中的截图)。像往常一样为UITextView创建一个IBOutlet。不要忘记遵守UITextViewDelegate。
  2. 在班级/视图的.h文件中添加插座,以便您可以在需要时设置/更改高度限制。在Storyboard中,按住Alt键并单击UITextView的高度约束,并将其连接到.h文件中的IBOutlet。
  3. @property (nonatomic, strong) IBOutlet NSLayoutConstraint *heightConstraint;

    enter image description here

    1. 将以下方法添加到.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];
       }
      
    2. 在调整textview大小方面,这似乎对我来说相当完美,同时保持对mkmapview的约束。随着textview的增长/缩小,mapview现在向下或向上移动: - )