0

我有一个 UIScrollView,其中包含从使用 CATiledLayer 的 UIView 派生的视图。本质上,在我的 ViewController 中viewDidLoad

_tiledView = [[TiledView alloc] initWithFrame:rect tileSize:_tileSize];

_scrollView = [[ScrollingView alloc] initWithFrame:rect];
_scrollView.contentSize = _tiledView.frame.size;
_scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
_scrollView.scrollEnabled = YES;
_scrollView.delegate = self;

[_scrollView addSubview:_tiledView];

最初,_tiledView 是 256x256 瓦片的 4x4 网格。我正在尝试增加_tiledView运行时的尺寸。在构建时_tiledView,我只是通过将图块的数量乘以它的大小来计算视图的大小。然后我设置 and 的大小_tiledView.frame_tiledView.bounds例如:

CGRect frame = self.frame;
frame.origin = CGPointZero;
frame.size = CGSizeMake(tileSize.width*4, tileSize.height*4);
self.frame = frame;
self.bounds = frame;

现在,当我在界面中点击一个按钮时,我要做的第一步就是将_tiledView右侧和底部的尺寸增加一个 256x256 瓷砖。这是我尝试的:

- (void)addTiles:(id)sender
{
    CGRect rect = _tiledView.frame;
    rect.size.width += _tileSize.width;
    rect.size.height += _tileSize.height;
    _tiledView.frame = rect;
    _tiledView.bounds = rect;
    CGSize size = _scrollView.contentSize;
    size.width += _tileSize.width;
    size.height += _tileSize.height;
    _scrollView.contentSize = size;
    [_scrollView setNeedsLayout];
}

但是,这并没有按预期工作。发生的情况是它_tiledView变得更大,就好像它被放大了一样 - 虽然与开始时相同数量的图块,即 4x4。我检查了_scrollView.contentsScaleFactor财产,它说1.0。我认为_scrollView在技术上没有放大内容。

我希望_tileView在界面中保持其当前位置,但添加 9 个新图块,即右侧 4 个、底部 4 个和右下角 1 个。取而代之的是,最初的 16 块瓷砖变得更大,以填充原本可以被 25 块瓷砖填充的空间。

我错过了什么?我究竟做错了什么?任何帮助,将不胜感激。

4

1 回答 1

0

万一有人觉得它有用。进一步挖掘后,我意识到我的 contentMode 默认为 ScaleToFill。所以我将其设置为:

_tiledView.contentMode = UIViewContentModeRedraw;

初始化时。并像这样调整 addTiles:

CGRect rect = _tiledView.frame;
rect.size.width += _tileSize.width;
rect.size.height += _tileSize.height;
_tiledView.frame = rect;
_tiledView.bounds = rect;
_scrollView.contentSize = rect.size;
[_tiledView setNeedsDisplay];

而且,这达到了我想要的效果。

于 2013-06-18T17:07:44.527 回答