iOS:如何在 UIScrollView 中显示长文本?

Posted

技术标签:

【中文标题】iOS:如何在 UIScrollView 中显示长文本?【英文标题】:iOS: how to display a long text in a UIScrollView? 【发布时间】:2015-05-11 11:42:25 【问题描述】:

已编辑

我有一个 UIScrollView,它的顶部有一个 ImageView,在它下面有一个 UIlabel,在它下面我想放一个长文本。

我尝试在UIScrollView 中添加UITextView,但UITextView 有自己的滚动条,我需要输入长文本并让UIScrollView 滚动而不是UITextView

我怎样才能做到这一点?

【问题讨论】:

为什么在UIScrollView 中需要UITextView 我没有,我只需要放一个长文本,让用户滚动查看所有文本,我尝试了 UITextView,但它有自己的滚动条。我该怎么做? 为什么不给UITextView 约束来填充整个屏幕(或您想要的特定区域)?如果您使用的是Storyboard,它应该会更容易。 我也试过UILabel,但是标签有预定义的高度和行数 @asaf 啊,抱歉忘记提到滚动视图中还有其他内容,顶部有一个图像,然后是一个标签,然后在下面我想要长文本 【参考方案1】:

我认为这种方式可以做你正在尝试的事情。在我的代码中,我使用了 UILabel 并根据 String 长度给它一个大小。 这是我的代码

//Add an scroll to full size frame to view
UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
//some properties of scroll
scroll.userInteractionEnabled = YES;
scroll.showsHorizontalScrollIndicator = YES;
[self.view addSubview:scroll];
//now add views into the scroll
UIImageView *myTopImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, scroll.frame.size.width, 100)];
myTopImage.image = [UIImage imageNamed:@"your_image.png"];
UIFont *myFont = [UIFont fontWithName:@"Helvetica Neue" size:30];
[scroll addSubview:myTopImage];

NSString *myText = @"your  long text here";
//calculate width if it bigger than frame's width make it multiline
int width = [self calculateWidthForText:myText forHeight:30 forFont:myFont]+2;
if (width > scroll.frame.size.width) 
    width = scroll.frame.size.width;
    //calculate height for specific width
    int height = [self calculateHeightForText:myText forWidth:scroll.frame.size.width forFont:myFont]+2;
    //change your scroll contentSize
    scroll.contentSize = CGSizeMake(self.view.frame.size.width, myTopImage.frame.size.height + height);

    //now create your label
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, width, height)];
    myLabel.numberOfLines = 0;
    myLabel.text = myText;
    myLabel.textAlignment = NSTextAlignmentLeft;
    myLabel.font = myFont;
    [scroll addSubview:myLabel];

else 

    //if it is smaller than width give it specific height and init
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, width, 30)];
    myLabel.numberOfLines = 0;
    myLabel.text = myText;
    myLabel.textAlignment = NSTextAlignmentLeft;
    myLabel.font = myFont;
    [scroll addSubview:myLabel];


这是我计算字符串大小的方法

- (CGFloat) calculateHeightForText:(NSString *)str forWidth:(CGFloat)width forFont:(UIFont *)font 
CGFloat result = 20.0f;
    if (str) 
        CGSize textSize =  width, 20000.0f ;
        CGSize size = [str sizeWithFont:font constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
        result = MAX(size.height, 20.0f);
    
    return result;


- (CGFloat) calculateWidthForText:(NSString *)str forHeight:(CGFloat)height forFont:(UIFont *)font 
CGFloat result = 20.0f;
    if (str) 
        CGSize textSize =  20000.0f, height ;
        CGSize size = [str sizeWithFont:font constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
        result = MAX(size.width, 20.0f);
    
    return result;

【讨论】:

以上是关于iOS:如何在 UIScrollView 中显示长文本?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中检测长按

UIScrollView里面章节长文本的构造

如何使按钮在 UIScrollView 内滚动?

如何在 ios 中为 UIScrollView 设置对齐方式

如何在 iOS 中将 UIView 添加到 UIScrollView 中(具有动态内容的视图)

显示键盘时如何决定滚动哪个 UIScrollView