我有一个可缩放的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的问题,并找到了我需要的东西。
好的,所以最终我找到了答案,因为Ismael建议我必须调整宽度,问题是找到方程。
缩放的工作方式和滚动视图子视图的宽度在一开始并不明显。
一旦在滚动视图中缩放UIView,并且希望其宽度相同,就必须将元素的宽度除以缩放比例。
也就是说,如果你最初的宽度是600,一旦你缩放,你可以认为宽度已经改变了,你只需要再次将其调整为600,但事实并非如此。600将自动地乘以刻度。因此,正确的答案是将其调整为600/scale。在这里我们分开。
现在的代码:
一切都发生在方法中:
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollViewtmp withView:(UIView *)view atScale:(float)scale{}
第一件事是去除模糊的字体:
messageLabel.contentScaleFactor=scale;
在另一种方法中,我保存了UILabel消息标签的初始宽度(在滚动视图中),我调用了变量"initialWidth",即600。这一点很重要,因为我在scrollViewDidEndZooming方法中开始使用当前的messageLabel宽度一次。
要将滚动视图的子视图的宽度重新调整为600,我们只需将初始宽度除以缩放比例,并重新调整标签:
[messageLabel setFrame:CGRectMake(0,0,(initialWidth/scale), messageLabel.frame.size.height)];
[messageLabel sizeToFit];
在这一点上,我们有一个可以缩放的滚动视图,带有一个标签,可以将文本重新调整到滚动视图的初始宽度,我们没有水平滚动条,但我们有个问题,垂直滚动条的高度错误:我们只能滚动文本的一部分。
这是第二个很难解决的问题。如果您将messageLabel高度传递给contentsize,奇怪的是,它似乎不起作用,即使我在NSLogs中得到一个高度乘以刻度,它也不会改变滚动的高度,就好像在内部再次划分一样。例如,如果初始高度是500,缩放2后,我得到1000高度,如果我将该值传递给ContentSize,它将保持不变,就像它再次除以2一样。
所以这次的解决方案是乘以比例。
我们只需要添加以下行:
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, (messageLabel.frame.origin.y+messageLabel.frame.size.height)*scale)];
正如所看到的,困难的部分是理解这种混乱的除以或乘以比例。
缩放后,UIScrollView
的contentSize
按比例增加(originalContentSize*zoomScale),因此当您再次调整时,它将变小
示例:您的scrollView.frame
是(0,0,100,100),而您的contentSize
是(100,100。缩放到2.0后,contentSize
将为(200200)。然后手动将其设置为(100,100),这等于不缩放的contentSize
(50,50)。
由于(contentSize.width <= scrollView.frame.size.width
),将不会进行水平滚动,并且标签的最右侧部分不可见。
尽量不要调整contentSize
。滚动将成为可能,然后用户可以到达整个标签
编辑:重新阅读您的问题,如果您希望标签在缩放后进行调整并完全可见,那么除了调整contentSize
之外,您还需要调整messageLabel's
帧。标签应正确包装