调整 UIView 的大小,但 drawRect 完成的绘图也会改变大小

Posted

技术标签:

【中文标题】调整 UIView 的大小,但 drawRect 完成的绘图也会改变大小【英文标题】:Resizing a UIView but drawing done by drawRect also changing size 【发布时间】:2015-10-17 20:26:55 【问题描述】:

我正在使用 UISlider 测试 UIView,如下图示例所示:

我有一个黄色背景的自定义UIView,绘制灰色方块,drawRect方法是这样的:

-(void)drawRect:(CGRect)rect

    NSLog(@"Draw rect called");

    UIBezierPath* squarePath = [UIBezierPath bezierPathWithRect: CGRectMake(10, 10, 100, 100)];
    [UIColor.grayColor setFill];
    [squarePath fill];

以及我的幻灯片更改值的方法:

- (IBAction)changeValue:(id)sender 

    CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, self.slider.value, self.slider.value);
    self.tableView.transform = transform;
    [self.tableView setNeedsDisplay];




我不明白为什么广场越来越大。我注意到每次移动滑块时都会调用 drawRect 。如果发生这种情况,那么为什么正方形大小会发生变化?它不应该保持相同的大小,只是框架与左上角的正方形一起增长吗?

我的第二个问题是,我将如何更改代码以使框架变大而图纸尺寸保持不变?我问这个是因为实际上我希望在 drawRect 中使用我自己的代码动态更改绘图大小。

任何指针将不胜感激!谢谢!

【问题讨论】:

【参考方案1】:

方块的大小之所以会发生变化,是因为你对它进行了改造。变换不仅仅影响视图的框架;它们会影响内容。正方形以恒定大小 (100x100) 被绘制到其上下文中,然后变换在渲染之前对其进行拉伸。

它没有向右和向下扩展的原因是因为默认情况下变换的锚点是边界的中心。因此它将从中心向外缩放。来自文档:

变换的原点是 center 属性的值 ...

转换并非旨在简单地缩放框架的宽度和高度。 frame 属性就是为此而生的。只需将视图的框架存储在变量中,更改其宽度和高度,然后将其设置回来。在您的drawRect: 代码中,您可以检查提供给您的矩形的尺寸,并将您的正方形的宽度/高度设为其中的百分比。

【讨论】:

以上是关于调整 UIView 的大小,但 drawRect 完成的绘图也会改变大小的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIView drawRect 调整大小动画

调整 UIView 的大小,以便我绘制的任何内容都可见 - Objective C

如何在drawRect中获取UIView大小

仅在 UIView 顶部的圆角

UIView 调整大小但不是子视图

drawRect 会改变内在内容大小吗?