缩放UIScrollview可缩放后如何调整UILabel文本的大小

Posted

技术标签:

【中文标题】缩放UIScrollview可缩放后如何调整UILabel文本的大小【英文标题】:How to resize UILabel text after zooming UIScrollview zoomable 【发布时间】:2012-11-23 13:48:09 【问题描述】:

我有一个可缩放的 UIScrollview,子视图是一个 UIView (viewTexto),其中包含一个 UILabel (messageLabel)。

这是代码

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollViewtmp

    return viewTexto;

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollViewtmp withView:(UIView *)view atScale:(float)scale

        messageLabel.contentScaleFactor=scale;

    [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, messageLabel.frame.origin.y + messageLabel.frame.size.heightt)];

    

用这段代码我可以缩放,而且文字不模糊,没有水平滚动但是UILabel的尺寸仍然太大,所以它被剪切了。我需要 UILabel 的宽度再次像开始那样采用 scrollView 的宽度。

我已经阅读了关于 SO 中 UIScrollViews 的任何问题,并找到了我所需要的。

【问题讨论】:

【参考方案1】:

好的,所以最后我找到了答案,因为 Ismael 建议我必须调整宽度,问题是找到方程式。

缩放的工作方式和滚动视图的子视图的宽度在开始时并不明显。

一旦您在滚动视图中缩放 UIView,并且您希望它具有相同的宽度,您必须将元素的宽度除以比例。

也就是说,如果你的初始宽度是600,一旦你缩放你可以认为宽度已经改变了,你只需要重新调整它到600,但事实并非如此。 600 将自动乘以比例。所以正确的答案是将其调整为 600 / 比例。 在这里我们分开。

现在是代码:

一切都发生在方法中:

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollViewtmp withView:(UIView *)view atScale:(float)scale

首先要去掉模糊的字体:

 messageLabel.contentScaleFactor=scale;

在另一种方法中,我保存了 UILabel messageLabel 的初始宽度(在滚动视图内),我将变量称为“initialWidth”,即 600。这很重要,因为我在 scrollViewDidEndZooming 方法中开始使用当前的 messageLabel 宽度一次。

要将scrollview的子视图的宽度重新调整为600,我们只需要将初始宽度除以缩放比例,然后重新调整标签即可:

[messageLabel setFrame:CGRectMake(0,0,(initialWidth/scale), messageLabel.frame.size.height)];
[messageLabel sizeToFit];

此时,我们有了一个可以缩放的scrollview,带有一个将文本重新调整为scrollview初始宽度的Label,我们没有水平滚动条,但是我们有一个问题,垂直滚动条有一个高度错误:我们只能滚动文本的一部分。

这是第二个难以解决的问题。 如果你将 messageLabel 高度传递给 contentsize,奇怪的是它似乎不起作用,即使我得到一个高度乘以我的 NSLogs 中的比例,它也不会改变滚动的高度,就好像在内部它被分割了再次。例如,如果初始高度为 500,在缩放 2 后,我得到 1000 高度,如果我将此值传递给 ContentSize,它保持不变,就好像它再次被 2 整除一样。

所以这次的解决方案是乘以比例。

我们只需要添加这一行:

   [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, (messageLabel.frame.origin.y+messageLabel.frame.size.height)*scale)];

正如我们所看到的,困难的部分是要理解这个用比例除或乘的混乱。

【讨论】:

@netadictors 我认为您的建议将帮助我解决我的***.com/questions/19728213/… 问题。如何在缩放时设置 UILable 的高度?【参考方案2】:

缩放后,UIScrollViewcontentSize 会按比例增加(originalContentSize * zoomScale),所以再次调整时会变小

示例: 你的 scrollView.frame 是 (0, 0, 100, 100),你的 contentSize 是 (100, 100)。 放大到 2.0 后,您的 contentSize 将是 (200, 200)。 然后手动将其置于 (100, 100) 处,这等于 (50, 50) 的 contentSize 没有缩放。

由于 (contentSize.width <= scrollView.frame.size.width),将不会有水平滚动,并且标签的最右侧部分不可见。

尽量不要调整contentSize。然后可以滚动,并且用户可以到达整个标签

编辑:重新阅读您的问题,如果您希望标签在缩放后调整并完全可见,除了调整contentSize 之外,您还需要调整messageLabel's 框架。标签应正确包裹自己

【讨论】:

以上是关于缩放UIScrollview可缩放后如何调整UILabel文本的大小的主要内容,如果未能解决你的问题,请参考以下文章

在可缩放的滚动视图中禁用图像视图缩放

在 UIScrollView 中绘制 UIBezierPath

带有两个图像的 UIScrollview - 保持 1 个图像可缩放和 1 个图像静态(固定大小)

可以实现 UIScrollView 与可缩放和方面适合的内容?

iOS7 自动布局与 Tabbar 结合 UIScrollView 和可缩放 UIImageView 不起作用

正确缩放包含许多子视图的 UIScrollView