UIScrollView中的drawRect裁剪

Posted

技术标签:

【中文标题】UIScrollView中的drawRect裁剪【英文标题】:drawRect cropping in UIScrollView 【发布时间】:2012-02-07 09:45:04 【问题描述】:

我正在尝试将图像绘制到覆盖 drawRect 的 UIView 子类中。这个图像绘制类需要移动和缩放功能,所以我把它做成了滚动视图的子视图。

我的问题是我的图像似乎被屏幕或滚动视图边界裁剪(图像大于屏幕)。我不知道为什么,这似乎是非常基本的东西。

我的 ViewController 中的视图层次结构如下所示:

View Controller
  View
    ScrollView
      MapView

我已经为滚动视图和地图视图(这是实现 drawRect 的视图)创建了出口。

用于配置滚动视图的 ViewController 初始设置代码如下所示:

- (void)viewDidLoad

    [super viewDidLoad];
    scrollView.delegate = self; 
    scrollView.contentSize = CGSizeMake(450, 476);
    scrollView.minimumZoomScale = 0.6;
    scrollView.maximumZoomScale = 6.0;

我的 drawRect 实现:

- (void)drawRect:(CGRect)rect
 
    UIImage *myImage = [UIImage imageNamed:@"map.jpg"];
    CGRect rectangle = CGRectMake(0,0,450,476);
    [myImage drawInRect:rectangle];

图像在滚动视图中是可拖动和可缩放的,但它似乎在屏幕边界处被裁剪。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

drawRect 不能在作为参数传递给 drawRect 方法的 rect 之外绘制,这是由视图框架决定的。使您的视图为 1200,1200,并确保在所有包含视图上禁用 clipToBounds。

【讨论】:

好的,我猜这就是我的视图框架的作用。感谢您提供的信息,这是有道理的。 是的,完全正确。设置视图框架(实际上它是 view.bounds,从技术上讲,但它们通常是相同的)并 drawRect 绘制该框架的内容。【参考方案2】:

您的问题可能出在drawInRect。来自 UIImage 类的文档:

drawInRect:
Draws the entire image in the specified rectangle, scaling it as needed to fit.

根据需要将该矩形放大,并将其置于 UIImageView 的中心。这个问题在这里回答UIScrollView image/photo viewer with paging enabled and zooming

【讨论】:

您好,感谢您的回复。但是如果我将代码更改为 CGRect rectangle = CGRectMake(0,0,1200,1200);它还在被裁剪。我发布的代码中的矩形尺寸是图像的实际尺寸。 看看我上面贴的链接。有示例代码和 WWDC 视频如何从苹果制作整个照片应用程序。搜索移动和缩放。 好的,使用你的链接我发现我需要为我的 mapView 设置一个框架,使用:CGRect mapFrame; mapFrame.origin = CGPointMake(0, 0); mapFrame.size = CGSizeMake(450, 476); mapView.frame = mapFrame;

以上是关于UIScrollView中的drawRect裁剪的主要内容,如果未能解决你的问题,请参考以下文章

drawRect 使 UIScrollView 中的滚动变慢

在 UIScrollView 中覆盖 drawRect 时的黑色背景

绘图 + UITableViewCell + UIScrollView 子类?

UIScrollView 中的 UIView 子类如何处理内存

捕捉 UIScrollView 的可见部分后裁剪图像的透明部分

使用drawRect延迟加载UIView:绘图