动态调整UILabel的大小,并使用Interface Builder将UIViews重新定位在它下面

时间:2013-04-10 14:01:28

标签: ios uiview interface-builder uilabel xib

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

我正在尝试使用XIB文件中的内置功能,而且根本没有运气。

自动调整UILabel的设置:

Autosizing for UILabel

自动调整UILabel下面的所有UIViews:

enter image description here

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

  1. 屏幕加载
  2. 标签上填充了一定数量的宽度约束的可用文本
  3. {li> UIView's下面的UILabel被重新定位,因为UILabel的高度已经从XIB文件中显示的高度增加
  4. 用户按下“查看更多”并调整UILabel的大小以适应所有可用文本并增加高度,所有UIView都会相应地在屏幕下方重新定位
  5. 用户按下“查看更少”,UILabel高度减少,隐藏更多文字,UIView's相应地向后移动。
  6. 谢谢,希望这清楚解释!我试图尽可能多地在XIB文件中减少代码,但是如果证明是唯一的解决方案(我希望不是),那么我的所有UI元素仍然可以通过IBOutlets访问

    注意:我需要支持iOS4.3及更高版本,因此无法使用iOS6自动布局功能。

2 个答案:

答案 0 :(得分:1)

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

如果您愿意,可以在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路线,您需要将您的子视图放在一个父视图中并调整父视图的大小 - 这应该告诉孩子们更新他们的位置/大小。

希望这有帮助。

答案 1 :(得分:0)

我最终无法使用自动调整功能,所以我通过创建一个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.
    }    
}