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