我想创建“圆形”“半透明”UIView(或任何类似的东西) 我的下面的代码导致动画效果,逐渐改变透明密度。 我想要的是避免这种效果,并从头开始直接绘制结果图像。
谁能知道该怎么做? 谢谢。
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
// Initialization code
super.opaque = NO;
self.alpha = 1.0f;
self.strokeColor = kDefaultStrokeColor;
super.backgroundColor = [UIColor clearColor];
self.rectColor = kDefaultRectColor;
self.strokeWidth = kDefaultStrokeWidth;
self.cornerRadius = kDefaultCornerRadius;
self.contentMode = UIViewContentModeRedraw;
self.clearsContextBeforeDrawing = NO;
}
return self;
}
- (void)setBackgroundColor:(UIColor *)newBGColor
{
// Ignore attempt to set backgroundColor
}
- (void)setOpaque:(BOOL)newIsOpaque
{
// Ignore attempt to set opaque to YES.
}
- (void)drawRect:(CGRect)rect {
BOOL areEnabled = [UIView areAnimationsEnabled];
// with or without setAnimationsEnabled:NO gives me the same result
[UIView setAnimationsEnabled:NO];
// with or without beginAnimations and commitAnimations gives me the same result
[UIView beginAnimations:@"test" context:nil];
[UIView setAnimationRepeatCount:1];
// [UIView setAnimationBeginsFromCurrentState:YES];
// With or without setAnimationDelay gives me the same result
//[UIView setAnimationDelay:0.0f];
// With or without setAnimationDuration gives me the same result
// passing 0.0f the same
//[UIView setAnimationDuration:0.1f];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
CGContextSetLineWidth(context, strokeWidth);
CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);
CGContextSetFillColorWithColor(context, self.rectColor.CGColor);
CGRect rrect = self.bounds;
CGFloat radius = cornerRadius;
CGFloat width = CGRectGetWidth(rrect);
CGFloat height = CGRectGetHeight(rrect);
// Make sure corner radius isn't larger than half the shorter side
if (radius > width/2.0)
radius = width/2.0;
if (radius > height/2.0)
radius = height/2.0;
CGFloat minx = CGRectGetMinX(rrect);
CGFloat midx = CGRectGetMidX(rrect);
CGFloat maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect);
CGFloat midy = CGRectGetMidY(rrect);
CGFloat maxy = CGRectGetMaxY(rrect);
CGContextMoveToPoint(context, minx, midy);
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
CGContextClip(context);
[UIView commitAnimations];
[UIView setAnimationsEnabled:areEnabled];
// I am stacked...
}
答案 0 :(得分:2)
以下是我在Cocoa Touch应用程序中完成的工作:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// Change opacity (or whatever) here.
[CATransaction commit];
不确定这是否是最佳方式(或者它甚至可以在iPhone环境之外工作),因为我自己有点像Cocoa新手。但值得一试。
答案 1 :(得分:1)
在drawRect中使用UIView动画毫无意义。此外,由于CoreAnimation为图层而不是视图属性设置动画,因此无法通过覆盖UIView属性来禁用动画。如果使用其中一个视图时alpha会消失,则问题不在于classe的实现,而是在调用它的位置。在设置视图或超级视图的alpha之前,某些周围代码执行了[UIView beginAnimations]
。
禁用所有动画,您可以使用David提出的方法。
答案 2 :(得分:1)
从3.0开始,您可以轻松地查看圆角:
1)将clipsToBounds
设为YES
。
2)将view.layer.cornerRadius
设置为某个值(5.0非常好,但您可以使用值)。这还需要您在设置此属性的文件中#import <QuartzCore/QuartzCore.h>
。
全部完成!
如果您使用IB来定义视图,则可以在IB中设置子视图剪辑,但不能修改图层属性,因此您必须在viewDidLoad或类似的地方添加该部分。