Ios Can';旋转时,背景梯度不能填充整个屏幕

Ios Can';旋转时,背景梯度不能填充整个屏幕,ios,objective-c,Ios,Objective C,当屏幕最初以纵向模式渲染时,我有一个背景渐变,可以很好地绘制。但是,当设备旋转到横向模式时,屏幕右侧40%为黑色(即背景未绘制在之前未绘制的屏幕部分)。我不知道如何重新绘制背景以填充整个屏幕 谁能告诉我我做错了什么?谢谢 以下是最初绘制时的外观。 现在,当我旋转它时,它看起来是这样的: 下面是我的背景渐变类的代码: #import "BackgroundGradient.h" @interface BackgroundGradient() @property (strong, nonato

当屏幕最初以纵向模式渲染时,我有一个背景渐变,可以很好地绘制。但是,当设备旋转到横向模式时,屏幕右侧40%为黑色(即背景未绘制在之前未绘制的屏幕部分)。我不知道如何重新绘制背景以填充整个屏幕

谁能告诉我我做错了什么?谢谢

以下是最初绘制时的外观。

现在,当我旋转它时,它看起来是这样的:

下面是我的背景渐变类的代码:

#import "BackgroundGradient.h"

@interface BackgroundGradient()
@property (strong, nonatomic) UIView *view;
@end

@implementation BackgroundGradient

- (id) initWithView:(UIView *) view
{
    if (!_view)
        _view = view;

    return self;
}

- (void) makeGradient
{
    UIColor *darkOp = [UIColor colorWithRed:(193.0 / 255.0) green:(215.0 / 255.0) blue:(46.0 / 255.0) alpha: 1];
    UIColor *lightOp = [UIColor colorWithRed:(222.0 / 255.0) green:(233.0 / 255.0) blue:(143.0 / 255.0) alpha: 1];

    // Create the gradient
    CAGradientLayer *gradient = [CAGradientLayer layer];

    // Set colors
    gradient.colors = [NSArray arrayWithObjects:
                       (id)darkOp.CGColor,
                       (id)lightOp.CGColor,
                       (id)darkOp.CGColor,
                       nil];

    // Update the start and end points
    gradient.startPoint = CGPointMake(0.5, 0.0);
    gradient.endPoint = CGPointMake(0.5, 1.0);

    // Set bounds
    gradient.frame = self.view.bounds;

    // Add the gradient to the view
    [self.view.layer insertSublayer:gradient atIndex:0];

    gradient.locations = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.7],
                          [NSNumber numberWithFloat:0.9],
                          nil];

}

@end
最后,这里是我如何实例化背景对象的:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.background = [[BackgroundGradient alloc] initWithView:self.view];
    [self.background makeGradient];

}
编辑:我添加了以下代码,并包括对起点和终点的更新(如上所述):

我就快到了,但现在,我明白了。请注意,仍然有一条垂直线。在我看来,新的背景像是在前一个背景之后绘制的,这样前一个背景仍然存在,并且阻止了新的背景。当从纵向到横向的动画正在发生时,这一点尤其明显


这就是你做错的地方:
CAGradientLayer*gradient=[CAGradientLayer]
[self.view.layer insertSublayer:gradient atIndex:0]

每次设备旋转时,您都在“添加”渐变层的新实例。你不应该那样做。取而代之的是,只需将它的框架设置为旋转,一切都会非常顺利。只使用一个实例。在
viewDidLoad


在这种情况下,请使用视图调试提供帮助。

我通过以下方法解决了此问题: 调整背景图像的子层大小

Swift

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    self.backgroundImageView.layer.sublayers?.first?.frame = self.view.bounds

}

viewdilayoutsubviews
中更新渐变的帧:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // find gradient layer
    let gradLayers = gradientView.layer.sublayers?.flatMap { $0 as? CAGradientLayer }
    // this assumes there is only one gradient layer
    gradLayers?.first?.frame = gradientView.bounds
}

你是否重新绘制渐变(可能来自
WillAnimateRotationInterfaceOrientation:duration:
),以便获得新的旋转帧?不,这就是我一直坚持的。我该怎么做?您是否尝试过VC的任何布局方法来更新帧?从调用
WillAnimateRotationInterfaceOrientation:duration:
viewWillLayoutSubviews
或中的其他方法之一。感谢您的帮助。请参阅上面我的编辑。我可以用渐变来填充屏幕,但它仍然不对。我想你为我节省了几个小时)谢谢!我也有同样的问题。这个解决方案奏效了。更新的syntext:override func-willAnimateRotation(to-toInterfaceOrientation:UIInterfaceOrientation,duration:TimeInterval){self.view.layer.sublayers?.first?.frame=self.view.bounds}
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // find gradient layer
    let gradLayers = gradientView.layer.sublayers?.flatMap { $0 as? CAGradientLayer }
    // this assumes there is only one gradient layer
    gradLayers?.first?.frame = gradientView.bounds
}