我有一个UILabel
,可以包含任意数量的宽度受限的行。我调整UILabel
以适应给定文本没有问题,但是,我正在实现“查看更多...”/“查看更少...”按钮,这将增加或减少UILabel
。基于此,此UIView's
以下的任何UILabel
都会受到影响,因此需要在其y轴上重新定位。
我正在尝试使用XIB文件中的内置功能,而且根本没有运气。
自动调整UILabel的设置:
自动调整UILabel下面的所有UIViews:
有人能指出我在正确的方向吗?所以基本上是一个场景:
UIView's
下面的UILabel
被重新定位,因为UILabel
的高度已经从XIB文件中显示的高度增加
UILabel
的大小以适应所有可用文本并增加高度,所有UIView都会相应地在屏幕下方重新定位UILabel
高度减少,隐藏更多文字,UIView's
相应地向后移动。谢谢,希望这清楚解释!我试图尽可能多地在XIB文件中减少代码,但是如果证明是唯一的解决方案(我希望不是),那么我的所有UI元素仍然可以通过IBOutlets
访问
注意:我需要支持iOS4.3及更高版本,因此无法使用iOS6自动布局功能。
答案 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.
}
}