整页面可变高度UIScrollView和可变高度UITableViewCell的方法

经常做程序会有需要一页显示不完的东西要滚动,而且又正好碰上比如里面的UITextView里文字字数不确定而如果字太多要做滚动的方式,虽然UITextView自带了UIScrollView但是还是觉得不如一整页滚动的效果好?
于是解决方法就是使用单独的UIScrollView,这货在程序中应该算是最不智能的东西吧?而且又正好碰上一些高度不确定的东西比如刚才说的UITextView里的文字,似乎不能不用代码来解决了。
但是作为非老开发者来说,非常不希望完全使用代码来写界面,那么应该如何配合StoryBoard或者nib文件来制作UIScrollView呢?
解决方法的思路是这样的,首先要根据文本来确定UITextView的高度,然后再加上界面上其他东西的高度(应该说是总高度),来绘制ScrollView。
可参考这个
于是第一步:确定UITextView的高度,而这需要根据文本来运算,既然文本长度不确定,自然要从文本上下功夫了:

NSString *text = self.textview.text;
CGSize stringSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:14] constrainedToSize:CGSizeMake(320, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

代码分解第一步获取到textview里的文本,然后根据文本来确定文本的大小(宽度和高度),其中需要根据你自己实际情况修改的:
1.boldSystemFontOfSize是textview里文本的字体大小。
2.CGSizeMake里的320这个要根据textview的宽度来修改,比如在这里宽度占完整个屏幕就是320(不是640哦,iOS后台会自动算Retina的)。
得到的stringSize就是实际文本的大小(包括宽度和高度,而下面我我们直接只用高度所以实际用的时候就直接:stringSize.height),接下来要把UITextView设置成这个尺寸,这样可以显示完全部的字:

[self.textview setFrame:CGRectMake(78, 0, 320, stringSize.height + 100)];

我为什么在后面会有个+ 100呢?因为实际调试的时候发现如果直接设置高度为stringSize.height会出现最下面两行被挡住了。总之这个数字可以根据自己实际情况进行调整。
而前面的78和0这两个对应的是textview所在界面的x,y值,这个可以直接在Storyboard或者nib里textview的size inspector里的View里看到,直接照用就行了。

高深人士应该能看得出其实这里已经是手动来绘制textview了,其实本来咱是想用setContentSize单独设定高度的,但是似乎没用…

设置完了UITextView之后来设置UIScrollView:

[self.scrollview setContentSize:CGSizeMake(320, stringSize.height + 200)];

这次后面+200是因为要包含界面上其他的东西。

于是这样应该就能达到效果了,如果有误差的话稍微调整以上提到的几个数值,应该能达到你想要的效果了。

另外还有一种解决方案就是使用静态的UITableView,因为其内置已经做好UIScrollView了,只要根据UITextView来决定cell的高度就可以了。
不过可变高度的cell又是如何做到的呢?上面已经知道了如何根据文本来确定高度,那么直接将高度应用在cell里不就好了~
于是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSArray *array = arraylist[row];
NSString *text = [array valueForKey:@"message"];
CGSize stringSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:12] constrainedToSize:CGSizeMake(292, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
return stringSize.height +50;
}

咱根据当前cell直接从array中直接读message,接下来的就和上面一样进行文本的长度确定,而到了最后则是返回stringSize.height,外加上自行调整的误差。

而至于当文本字体大小改变或者界面尺寸改变的时候,重新修改上面代码的对应变量即可(比如横屏等),重新运算过后就可以了。

最后附赠一个多点触控捏合缩小放大字体的代码(代码效果不是很好…参考):

- (void)viewDidLoad{
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
[self.textview addGestureRecognizer:pinchGesture];
}


- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
static int fontSize = 20;
if (sender.state == UIGestureRecognizerStateBegan)
{
// initialBounds = _view.bounds;
}
CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];
if(factor > 1.0)
{
fontSize += 1;
}
else
{
fontSize -= 1;
}
if (fontSize >50) {
fontSize =50; return;
}
if (fontSize <5) { fontSize = 5; return; } [self.textview setFont:[UIFont fontWithName:@"Helvetica" size:fontSize]]; return; }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

:b1 :b2 :b3 :b4 :b5 :b6 more »

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).

This site uses Akismet to reduce spam. Learn how your comment data is processed.