如何知道文本是否超出文本视图的范围?

时间:2012-12-21 01:09:52

标签: iphone objective-c ios ipad

我想知道文本何时超出UITextView的界限并要求用户滚动。知道某个字体占用了多少行是没用的 - 我怎么知道一定数量的文本会占用多少行?

enter image description here

在上图中,我会添加一个淡入淡出效果,以便我可以优雅地剪切文本视图。但是,如果没有要滚动的文本,则显示淡入淡出效果看起来不正确。

4 个答案:

答案 0 :(得分:3)

设置文本后获取contentSize。这是一个CGSize,height将是UITextView在不滚动的情况下显示文本所需的高度。

myTextView.text = someText;
CGSize textSize = myTextView.contentSize;
float verticalSpaceNeededByText = textSize.height;

答案 1 :(得分:1)

针对Swift 3.x进行了更新

func textExceedBoundsOf(_ textView: UITextView) -> Bool {
    let textHeight = textView.contentSize.height
    return textHeight > self.textView.bounds.height
}

答案 2 :(得分:0)

获取文本视图的属性文本并使用此方法计算大小:

- (CGSize) size;

然后你可以知道文本视图的界限和这个UIFont的属性:

@property(nonatomic,readonly) CGFloat lineHeight;  

请注意,属性字符串的大小仅对长度有用,因为它认为文本在同一行上。并且它不考虑行之间的空格。

答案 3 :(得分:0)

我编写了一个自定义appDelegate方法,我可以在应用程序的多个位置调用几个用法。方便确定高度以完全适合视图中的文本,自定义单元格高度,具有动态文本数据的表格行高度以及textViews等...


  1. 它非常灵活,您可以轻松确定任何文本需要在屏幕上,容器中或视图中完全显示的“感知”高度。

  2. 获得结果后,您可以将其与textView Height的大小进行比较,例如....

  3. 请记住,TextView的高度和TextView的textContainer高度之间有一点缓冲。非常小,但您可以通过发送比您的(TextView.frame.size.height -3)略小的MinHeight进行调整。

  4. 你也可以使用可选的填充物,如果你需要它,可以在另一个尺寸上给自己一点缓冲,这将会返回一个更大的容器。

  5. 如果您使用自定义字体,请使用新变量对其进行补偿并将其考虑在内,但原样,这对于系统字体非常有用。


  6. 示例逻辑:

    //Logic Example:
    if([appDelegate calculateTextHeight:@"Your_String_Passed_In_Here"] > textView.frame.size.height) {
    
        //Text will exceed Height of TextView and require scroll.
    
    }else {
        //Text is within the TextView without need to scroll. 
    }
    

    方法:

    -(NSInteger)calculateTextHeight:(NSString *)text:(NSInteger)FontSize:(NSInteger)MaxWidth:(NSInteger)MinHeight:(NSInteger)optionalHeightPadding {
    
        //Determine the Size based on the Inputs:
        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FontSize] constrainedToSize:CGSizeMake(MaxWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    
        //Add Optional Padding:
        int calH = size.height + optionalHeightPadding;
    
        //Determine if larger than Min:
        if (calH > MinHeight) {
            return size.height + optionalHeightPadding;
        }
    
        //Return Min
        return MinHeight;
    }
    

    抬头提醒:我以前使用 UILineBreakModeWordWrap ,但从iOS 6开始不推荐使用 NSLineBreakByWordWrapping