我现在正在尝试创建自己的文本面板(带代码突出显示等)。
事实上,除了一件事之外,一切都准备好了 - 滚动
我做了什么:
创建UIScrollView
并使用“界面”构建器将我自己的视图作为subview
插入。
在ViewController
viewDidLoad
方法中,我将初始textfield
大小指定为UIScrollView
内容大小。
当用户在我的文本字段中写入太多内容时。我调用delegate(ViewController
)来改变大小。
要做到这一点,我只需写
[scrollView setContentSize:newSize];
我得到的是增加滚动视图但不是我的文本字段 - 只显示空白行。我想我也需要设置我的视图大小,但我无法弄清楚如何......
我的问题的第二部分:
每当我调用[textField setNeedsDisplay]
时,它会调用drawRect:
方法,其中矩形等于我视图的整个大小(比它的可见部分大得多)。如果我尝试使用我的视图修改大小超过3 MB的文件,它会是什么样子?如何强制它仅重绘可见部分?
感谢您的关注。
答案 0 :(得分:10)
第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)且滚动视图不允许缩放,则可以使用滚动视图的内容偏移和边界大小找到可见的rect。
CGRect visibleRect;
visibleRect.origin = [scrollView contentOffset];
visibleRect.size = [scrollView bounds].size;
[self setNeedsDisplayInRect:visibleRect];
如果只是部分更改,您也可以选择绘制可见矩形的一部分。
答案 1 :(得分:2)
这比你想象的要简单,例如你的 UIScrollView 中有一个名为“ textDesc ”的 UITextView ,你想知道内容的大小,所以下一步将是这样的:
int contentHeight = textDesc.frame.size.height + textDesc.frame.origin.y;
计算 textDesc 的大小后,只需设置它:
[scrollView setContentSize:(CGSizeMake(320, contentHeight))];
就是这样,现在你的 scrollView 知道你里面文字的大小,并会自动调整大小,希望这会有所帮助,祝你好运。
答案 2 :(得分:0)
将文本字段autoresizingMask属性设置为灵活的高度和宽度:
[textField setAutoResizingMask:UIViewAutoResizingFlexibleHeight | UIViewAutoResizingFlexibleWidth];
当您更改父级的大小(scrollView的contentSize)时,这应该会自动展开视图
否则尝试:
[textField setFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)];
在您更改滚动视图的内容大小之后。