0

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

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

UILabel 的自动调整大小设置:

为 UILabel 自动调整大小

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

在此处输入图像描述

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

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

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

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

4

2 回答 2

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

希望这可以帮助。

于 2013-04-10T14:32:18.137 回答
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.
    }    
}
于 2013-04-16T14:44:41.623 回答