【问题标题】:ios Autolayout - move 2nd view when 1st view resizedios Autolayout - 当第一个视图调整大小时移动第二个视图
【发布时间】:2015-03-28 05:29:56
【问题描述】:

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

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

(我正在使用 Storyboards...GrowingTextView 是拖入故事板上并设置/子类化为 HPGrowingTextView 的 UIView。 除了地图视图没有移动......它可以正常工作(在没有地图视图的情况下进行了测试)

【问题讨论】:

    标签: ios objective-c autolayout constraints


    【解决方案1】:

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

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

    坦率地说,我对最初的布局是明智的感到有些惊讶。您是否有高度限制或其他东西来弥补HPGrowingTextView 没有固有尺寸的事实?

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

    【讨论】:

    • 谢谢肯。在尝试了一些其他自定义 uitextviews 之后,我将来自不同地方的几个解决方案/建议拼凑在一起。我只是使用标准 UITextView 的 95%。请参阅下面的答案。
    【解决方案2】:

    如果您不是在寻找额外的功能,那么使用标准的 UITextView 是相当容易的。

    1. 插入 UITextView,并添加常用的自动布局约束。在我的示例中,我有几个 UITextField,然后是我的 UITextView,然后是 MKMapView。每个都被限制在前一个项目下方 8 处。 (见原帖截图)。像往常一样为 UITextView 创建一个 IBOutlet。不要忘记遵守 UITextViewDelegate。
    2. 在您的类/视图的 .h 文件中添加一个插座,以便您可以在需要时设置/更改高度约束。在 Storyboard 中,按住 alt 键单击 UITextView 的高度约束,并将其连接到 .h 文件中的 IBOutlet。

    @property (nonatomic, strong) IBOutlet NSLayoutConstraint *heightConstraint;

    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];
       }
      

    目前这对我来说似乎在调整 textview 大小方面工作得相当完美,同时保持对 mkmapview 的约束。随着文本视图的增长/缩小,地图视图现在向下或向上移动:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多