0

我正在使用情节提要并实现了一个绘制同心圆的自定义 UIVIew。我正在使用约束来保持 UIView 水平居中,当我旋转我的设备时这工作正常。但是我的形状图层在旋转时没有正确调整。我尝试打印 self.frame 并且当我以横向模式启动应用程序时,它假定的 UIView 框架是纵向模式的,尽管我的 UIView 旋转正确(通过将背景颜色保持为黑色来检查)。我在下面的 handleViewRotation 中调用 setNeedsDisplay,如果我旋转设备,它会将视图带到正确的模式。但是一旦它在那个视图中并且我走出当前屏幕并旋转设备并返回然后 UIView 得到调整但图层保持在同一个地方(具有先前的方向假设)。

知道如何解决这个问题并调整图层。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
- (void)didRotate:(NSNotification *)iNotification {
    [self.myView handleViewRotation];
}

- (CAShapeLayer *)circleForRadius:(CGFloat)iRadius withColor:(CGColorRef)iColor andDashPattern:(BOOL)isDashPattern {
CAShapeLayer *aSignalcircle = [CAShapeLayer layer];
aSignalcircle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(self.frame.size.width / 2.0, 0.0, 2.0 * iRadius, 2.0 * iRadius) cornerRadius:iRadius].CGPath;
aSignalcircle.position = CGPointMake(0.0 - iRadius, 0.0 - iRadius);
aSignalcircle.fillColor = [UIColor clearColor].CGColor;
aSignalcircle.strokeColor = iColor;
aSignalcircle.lineWidth = kPSSignalStrokeWidth;

if (self.enableShadow) {
    aSignalcircle.shadowColor = [UIColor blackColor].CGColor;
    aSignalcircle.shadowOpacity = 0.5;
    aSignalcircle.shadowOffset = CGSizeMake(0, 0.25);
    aSignalcircle.shadowRadius = 0.5;
}

if (isDashPattern) {
    aSignalcircle.lineDashPattern = @[@1, @1];
}

return aSignalcircle;

}

4

1 回答 1

0

问题是核心图形的绘制速度比 UI 方向通知要快。使用下一个运行循环来绘制 UI 和淡入淡出效果使其看起来更好。

我在下面添加了一段代码以使其工作:

- (void)viewDidAppear:(BOOL)iAnimated {
    [super viewDidAppear:iAnimated];

    double delayInSeconds = 0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.myView handleViewRotation];
    });

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.beaconView.alpha = 1.0;
    } completion:nil];
于 2013-09-17T00:41:04.340 回答