【问题标题】:Resize UILabel dynamically and reposition UIViews below it using Interface Builder使用 Interface Builder 动态调整 UILabel 的大小并在其下方重新定位 UIView
【发布时间】:2013-04-10 14:01:27
【问题描述】:

我有一个UILabel,它可以包含任意数量的宽度受限的行。我调整UILabel 的大小以适应给定的文本没有问题,但是,我正在实现一个“查看更多...”/“查看更少...”按钮,这将增加或减少@987654325 的大小@。基于此,任何低于此UILabelUIView's 都会受到影响,并且需要相应地在其y 轴上重新定位。

我正在尝试使用 XIB 文件中的内置功能,但完全没有运气。

UILabel 的自动调整大小设置:

为 UILabel 下的所有 UIView 自动调整大小:

有人能在这里为我指出正确的方向吗?所以基本上一个场景是:

  1. 屏幕加载
  2. 标签填充了一定数量的可用文本,宽度受限
  3. UIView's 下面的 UILabel 被重新定位,因为 UILabel 的高度比 XIB 文件中显示的高度增加了
  4. 用户按下“查看更多”,UILabel 会调整大小以适应所有可用文本并增加高度,所有 UIView 都会相应地重新定位到屏幕下方
  5. 用户按下“查看更少”,UILabel 的高度会降低,隐藏更多文本,UIView's 会相应地向上移动。

谢谢,希望解释清楚!我正在尝试在 XIB 文件中尽可能多地减少代码,但我的所有 UI 元素仍然可以通过 IBOutlets 访问,如果这被证明是唯一的解决方案 (我希望不是) .

注意:我需要支持iOS4.3及以上,所以无法使用iOS6自动布局功能。

【问题讨论】:

  • 如果您使用自动布局,这可以只使用扩展和收缩标签所需的代码来完成。你有理由不使用它吗?
  • 抱歉我不明白你的问题?通过调整标签的高度来扩展和收缩标签,同时将其限制为特定宽度,当按下“查看更多/查看更少”按钮时会发生此事件
  • 我的问题是关于自动布局。为什么要使用 struts 和 springs 而不是自动布局(在 iOS 6 中默认打开)。是否需要支持 iOS 6 之前的操作系统?
  • 抱歉误会了。支持 4.3+ 所以不能使用自动布局功能。

标签: ios uiview interface-builder uilabel xib


【解决方案1】:

自动调整大小通常仅在您更改父视图的大小时强制执行子视图布局。您可以通过 IBOutlets 将其中的大部分链接起来,但是,当您点击查看更多按钮时,您必须告诉您的父视图调整大小。

如果您愿意,您可以在 UIView 上使用这些扩展:http://glassofcocoa.com/blog/2012/11/14/uiview-extensions/,您可以很容易地手动完成并使用动画 - 看起来像:

//assume you have a BOOL value wether toggled or not called 'isViewingMore' and a stored startHeight
- (IBAction)didTapViewMore:(id)sender
{
    if (!_isViewingMore)
    {
        _isViewingMore = YES;
        CGSize constraint = CGSizeMake(_myLabel.frame.size.width, CGFLOAT_MAX);
        CGFloat lblheight = [@"" sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:14.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap].height;
        _myLabel.height = lblHeight;
    }
    else
    {
        _isViewingMore = NO;
        myView.height = startHeight
    }
    UIView *lastView = nil;
    for (UIView *view in self.view.subviews)
    {
        if ((id)view != (id)_myLabel)
        {
            if (lastView == nil)
            {
                view.top = _myLabel.bottom;
            }
            else
            {
                view.top = lastView.bottom;
            }
            lastView = view;
        }
    }
}

如果您只想采用 IB 路线,则需要将您的子视图放在一个父视图中并调整父视图的大小 - 这应该告诉子视图更新他们的位置/大小。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我最终无法使用自动调整大小的功能,因此我通过创建一个 UIView 解决了这个问题,该 UIView 充当所有子视图的容器,这些子视图位于扩展的 UILabel 之下。

    然后,我能够创建一个辅助方法,根据全尺寸 UILabel 和半尺寸标签之间的差异调整框架。

    - (void)repositionMoveableViewContainerWithFrame:(CGRect)newFrame animated:(BOOL)animated
    {
        CGRect newContainerPosition = self.moveableViewsContainer.frame;
        CGFloat difference = (newFrame.size.height - self.adjustableLabel.frame.size.height);
        newContainerPosition.origin.y = newContainerPosition.origin.y + difference;
    
        if (animated) {
            // Adjust frame animated
        } else {
            // Adjust frame without animation.
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      相关资源
      最近更新 更多