iOS:如何更改UIScrollView内容的大小?

5

我现在正在尝试创建自己的文本面板(包括代码高亮等)。

实际上,除了一个问题之外,一切都准备就绪 - 滚动。

我已经完成了以下工作: 使用Interface Builder创建了UIScrollView并将自己的视图作为subview插入其中。

ViewControllerviewDidLoad方法中,我将初始textfield大小指向UIScrollView内容大小。

当用户在我的文本字段中写入太多内容时,我调用代理(即ViewController)来更改大小。 为此,我只需编写:

[scrollView setContentSize:newSize];

我遇到的问题是滚动视图增加了,但我的文本字段没有增加 - 只有空白行出现。我认为我需要设置视图的大小,但我不知道该如何设置...
我的另一个问题: 每次我调用[textField setNeedsDisplay]它都会调用drawRect:方法,并使用整个视图的矩形(比可见部分要大得多)。如果我尝试使用我的视图修改大小超过3 mb的文件,它会是什么样子?如何强制它仅重新绘制可见部分?
谢谢关注。
4个回答

11

第 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

第二部分:

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

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

如果只有部分内容发生改变,您也可以选择绘制可见矩形的一部分。


这对我来说几乎可以工作 - 我只需要更改CGPointZero,就像你的代码注释中提到的那样。但是,如果我想将我的UIScrollView向下移动约300个像素,我不确定要放什么 - 有什么想法吗? - Mxyk
1
@Mike 你只需将其替换为要放置的坐标,或使用具有这些值的点变量。您可以使用类似{{0,300},newSize}的东西将视图放置在滚动视图顶部以下300像素,并使用负值将其放置在上方。请注意,这会将视图移动到滚动视图中,而不是开始已滚动的视图。如果您想要后者,则需要更改滚动视图的contentOffset属性。 - ughoavgfhw
这其实是完全错误的。如果你确实想要强制内容大小,你必须在布局子视图内部实际执行它。(虽然设置需要显示无关紧要,因为它会自动执行。) - Fattie
另外,语法很简单,只需要使用.contentSize =即可。 - Fattie

1

这比你想象的要简单,例如你有一个名为 "textDesc" 的 UITextView 在你的 UIScrollView 中,你想知道内容的大小,那么下一步将如下所示:

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

计算完textDesc的大小后,只需设置即可:

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

现在,你的scrollView已经知道了它内部文本的大小,并且会自动调整大小,希望这能帮到你,祝好运。


0
将您的文本字段的autoresizingMask属性设置为高度和宽度灵活:
[textField setAutoResizingMask:UIViewAutoResizingFlexibleHeight | UIViewAutoResizingFlexibleWidth];

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

否则,请尝试:

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

在你改变滚动视图的内容大小之后。


代码应该是:[textField setAutoresizingMask: UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth]; -- 注意单词 "resizing" 的所有实例中都是小写字母 r。 - GlennRay

-1

如果你真的想要设置(即“覆盖”)滚动视图的内容大小:

只需要这样做,

someScroll.contentSize = CGSize(width: blah, height: blah)

然而,整个重点就是 - 就像设置框架一样 - 你必须在 layoutSubviews 中完成。

这完全没有意义,除非在 layoutSubviews 中执行此操作。(就像在布局中设置框架一样。)

OP所问的..

在这个QA中,OP只是不明白如何设置实际视图(即标签等)的高度。

请注意,在一般情况下,您永远不会设置滚动视图的文字属性.contentSize。(除非在极其不寻常和高级的情况下才会这样做。苹果甚至将其设为可写入可能是一个错误,在“正常”编程中更改它甚至看到它是没有意义的。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接