【问题标题】:iOS: how to change the size of the UIScrollView content?iOS:如何更改 UIScrollView 内容的大小?
【发布时间】:2011-07-24 18:53:33
【问题描述】:

我现在正在尝试创建自己的文本面板(带有代码突出显示等)。

事实上一切都准备好了,除了一件事——滚动

我做了什么: 创建 UIScrollView 并使用 Interface builder 将我自己的视图插入为 subview

ViewController viewDidLoad 方法中,我将初始 textfield 大小指定为 UIScrollView 内容大小。

当用户在我的文本字段中写入太多内容时。我打电话给委托(ViewController)来改变大小。 为此,我只需编写

[scrollView setContentSize:newSize];

我得到的是滚动视图的增加,而不是我的文本字段 - 只是出现了空白行。我想我也需要设置视图的大小,但我不知道如何...

我的问题的第二部分: 每次我调用[textField setNeedsDisplay] 时,它都会调用drawRect: 方法,矩形等于我的视图的整个大小(比它的可见部分大得多)。如果我尝试使用我的视图来修改大小超过 3 mb 的文件,它会是什么样子?如何强制它只重绘可见部分?

感谢您的关注。

【问题讨论】:

    标签: iphone objective-c uiscrollview


    【解决方案1】:

    将您的文本字段 autoresizingMask 属性设置为灵活的高度和宽度:

    [textField setAutoResizingMask:UIViewAutoResizingFlexibleHeight | UIViewAutoResizingFlexibleWidth];
    

    当您更改其父级的大小(滚动视图的 contentSize)时,这应该会自动扩展视图

    否则试试:

    [textField setFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)];
    

    就在您更改滚动视图的内容大小之后。

    【讨论】:

    • 代码应该是:[textField setAutoresizingMask: UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];——注意“resize”这个词的所有实例中的小写-r。
    【解决方案2】:

    第 1 部分

    滚动视图的内容大小实际上与其包含的视图的大小或位置无关。如果你想改变内容视图的大小以及滚动视图的内容,你需要调用两个不同的方法。

    CGSize newSize;
    UIScrollView *scrollView;
    // assume self is the content view
    CGRect newFrame = (CGRect){CGPointZero,newSize}; // Assuming you want to start at the top-left corner of the scroll view. Change CGPointZero as appropriate
    [scrollView setContentSize:newSize]; // Change scroll view's content size
    [self setFrame:newFrame]; // Change views actual size
    

    第 2 部分

    setNeedsDisplay 将整个视图标记为需要显示。要使其仅显示可见部分,您需要使用setNeedsDisplayInRect:visibleRect
    假设视图位于左上角(其框架的原点为 0)并且滚动视图不允许缩放,则可以使用滚动视图的内容偏移量和边界大小找到可见的矩形。

    CGRect visibleRect;
    visibleRect.origin = [scrollView contentOffset];
    visibleRect.size = [scrollView bounds].size;
    [self setNeedsDisplayInRect:visibleRect];
    

    如果仅部分更改,您也可以选择绘制可见矩形的一部分。

    【讨论】:

    • 这几乎对我有用 - 我只需要更改 CGPointZero,正如您的代码注释所提到的。但是,如果我想让我的 UIScrollView 向下移动约 300 像素,我不确定用什么来代替它——知道吗?
    • @Mike 您只需将其替换为您要放置的坐标,或具有这些值的点变量。您可以使用 {{0,300},newSize} 之类的东西将视图放置在滚动视图顶部下方 300 像素处,并使用负值将其放置在上方。请注意,这会在滚动视图中移动视图,而不是启动已经滚动的视图。如果你想要后者,你需要改变滚动视图的contentOffset属性。
    【解决方案3】:

    它比您想象的要简单,例如您的 UIScrollView 中有一个名为“textDesc”的 UITextView,并且您想知道内容的大小,因此下一步将如下所示:

    int contentHeight = textDesc.frame.size.height + textDesc.frame.origin.y;
    

    计算出textDesc的大小后,设置一下即可:

    [scrollView setContentSize:(CGSizeMake(320, contentHeight))];
    

    就是这样,现在你的 scrollView 知道你的文本在他里面的大小,并且会自动调整大小,希望这会有所帮助,祝你好运。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多