2016-09-08 62 views
0

我有構建接口添加一個子視圖和一些子層的主要的UIView(containerView在下面的代碼)的方法:的iOS添加子視圖和子層多次

- (void)gradeAnimation:(NSNumber*)grade withDuration:(double)duration { 

scoreLabel = [[UICountingLabel alloc] init]; 
scoreLabel.frame = CGRectOffset(_gradeLabel.frame, 0, 5); 
[_containerView addSubview:scoreLabel]; 

// Other code 

UIBezierPath *circlePathMin = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:-M_PI_4*1.2 endAngle:angle1 clockwise:YES]; 
circleMin    = [CAShapeLayer layer]; 
circleMin.path   = circlePathMin.CGPath; 
circleMin.lineCap  = kCALineCapButt; 
circleMin.fillColor  = [UIColor clearColor].CGColor; 
circleMin.lineWidth  = 14; 
circleMin.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor; 
circleMin.zPosition  = 3; 
[_containerView.layer addSublayer:circleMin]; 

UIBezierPath *circlePathMax = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:angle2 endAngle:5*M_PI_4*1.2 clockwise:YES]; 
circleMax    = [CAShapeLayer layer]; 
circleMax.path   = circlePathMax.CGPath; 
circleMax.lineCap  = kCALineCapButt; 
circleMax.fillColor  = [UIColor clearColor].CGColor; 
circleMax.lineWidth  = 14; 
circleMax.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor; 
circleMax.zPosition  = 3; 
[_containerView.layer addSublayer:circleMax]; 

UIBezierPath *circlePathMiddle = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:angle1+offsetRight endAngle:angle2+offsetLeft clockwise:YES]; 
circleMiddle    = [CAShapeLayer layer]; 
circleMiddle.path   = circlePathMiddle.CGPath; 
circleMiddle.lineCap  = kCALineCapButt; 
circleMiddle.fillColor  = [UIColor clearColor].CGColor; 
circleMiddle.lineWidth  = 14; 
circleMiddle.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor; 
circleMiddle.zPosition  = 3; 
[_containerView.layer addSublayer:circleMiddle]; 
} 

我的問題是,如果我打電話這種方法多次,subview和sublayers每次添加,他們不重繪,而是我想。這是爲什麼發生?

回答

1

讓我們談談只有一個對象,scoreLabel是UICountingLabel的一個對象。每次您調用gradeAnimation:withDuration:方法時,都會創建一個新對象並將其添加到您的視圖中。

您可以獲取一個屬性,然後啓動並添加一次您的視圖,並在該方法中您可以更改對象的位置或其他內容。

如果您不想更改當前方法,則在調用方法之前,必須從視圖中刪除先前的對象。所以一次只能看到一個對象。

+0

全局(定義在@implementation中)但我每次都啓動它們的對象。如果我只是這樣做了一次,謝謝。 – Heisenberg

+0

這是我的榮幸提供幫助。 :-) – shuvo

0

如果您使用的是addSublayeraddSubview那麼絕對會將新圖層或新視圖添加到containerView。如果你不希望每次添加它,並希望重繪(我的意思是新的實例 - 因爲我從你的問題重繪字理解),那麼在gradeAnimation方法作爲一線下方添加一行,

_containerView = [[UIView alloc]initWithFrame:self.view.bounds]; // you can set your desired frame 

。所以它會每次創建新的實例。或者您可以先刪除sublayerssubviews,然後添加新的!或者您可以在方法中創建新的containerView,並可以爲其添加子視圖和圖層,並可以將其分配給_containerView

0

首先從containerView中刪除所有子層。在您的方法開始處添加以下代碼。

for (CALayer *layer in _containerView) { 
    [layer removeFromSuperlayer]; 
}