iOS UIView drawRect 调整大小动画
Posted
技术标签:
【中文标题】iOS UIView drawRect 调整大小动画【英文标题】:iOS UIView drawRect resize animation 【发布时间】:2012-08-23 05:32:28 【问题描述】:我尝试在一个简单的 UIView 扩展中重写 drawRect 方法,以绘制一个带有圆角的矩形并用黑色填充它,并为视图设置动画以在触摸时调整大小。 问题是,调整大小会使绘图完全变形,就好像上下文始终保持不变一样。在动画期间从不调用drawRect。但是,如果我告诉视图在动画之后绘制自己,它会被正确绘制。
如何在不变形的情况下为调整大小设置动画?
- (void)drawRect:(CGRect)rect
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = rect.size.height * 0.5f;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect),
CGRectGetMaxX(rect), CGRectGetMaxY(rect), radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect),
CGRectGetMinX(rect), CGRectGetMaxY(rect), radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect),
CGRectGetMinX(rect), CGRectGetMinY(rect), radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect),
CGRectGetMaxX(rect), CGRectGetMinY(rect), radius);
CGPathCloseSubpath(path);
CGContextSaveGState(context);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextAddPath(context, path);
CGContextFillPath(context);
CGContextRestoreGState(context);
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[UIView animateWithDuration:1.f animations:^
self.frame = CGRectInset(self.frame, 0.f, -100.f);
];
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
[UIView animateWithDuration:1.f animations:^
self.frame = CGRectInset(self.frame, 0.f, +100.f);
];
【问题讨论】:
我猜这里nomadplanet.fr/2010/11/… 【参考方案1】:如果你想要 UIView 的圆角边缘,你不需要显式地重新定义 drawRect。有一种更简单的方法是更改 UIView 的 layer 属性。您的视图及其边框将在动画期间正确绘制。
// Make your view background color black
myView.backgroundColor = [UIColor blackColor];
// The following will allow you to change the color/border width/ corner radius of your UIView
myView.layer.borderColor = [UIColor whiteColor].CGColor;
myView.layer.borderWidth = kDefaultBorderWidth;
myView.layer.cornerRadius = kDefaultBorderRadius;
确保在 .m 文件中包含 #import <QuartzCore/QuartzCore.h>
并且已导入 QuartzCore.framework
【讨论】:
同意 - 并确保设置myView.clipsToBounds = YES;
。
是的,但是如果我想在那个圆角矩形上绘制一些自定义效果呢?
你想达到什么样的其他效果——我的回答和你的问题有关……
***.com/questions/9000376/… 根据这篇文章,drawrect 仅适用于一个时间点,因此无法与动画一起使用以上是关于iOS UIView drawRect 调整大小动画的主要内容,如果未能解决你的问题,请参考以下文章
调整 UIView 的大小,但 drawRect 完成的绘图也会改变大小
调整 UIView 的大小,以便我绘制的任何内容都可见 - Objective C