ios 横向模式下背景色只出现在屏幕的一半

ios background color only appears on half of screen in landscape mode

我目前正在使用以下方法设置视图的背景颜色

 //Set the background color
    CAGradientLayer *bgLayer = [BackgroundLayer blueGradient]; <---Calls method below
    bgLayer.frame = self.view.bounds;
    //self.view.layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer insertSublayer:bgLayer atIndex:0];

它是这样获取渐变色的-就是上面调用的方法

@implementation BackgroundLayer
//Blue gradient background
+ (CAGradientLayer*) blueGradient {

    UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0];
    UIColor *colorTwo = [UIColor colorWithRed:(57/255.0)  green:(79/255.0)  blue:(96/255.0)  alpha:1.0];

    NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
    NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
    NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];

    NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];

    CAGradientLayer *headerLayer = [CAGradientLayer layer];
    headerLayer.colors = colors;
    headerLayer.locations = locations;

    return headerLayer;
}

@end

现在在肖像模式下,背景看起来很好。然而在横向模式下,它只覆盖了一半的屏幕,另一半是白色的。这是为什么 ?我该如何解决。我尝试了以下方法来改变颜色

self.view.layer.backgroundColor = [UIColor redColor].CGColor;

以上在横向和纵向模式下都可以正常工作,但它不是渐变。关于如何使渐变起作用的任何想法?

正确的代码行是:self.view.backgroundColor = [UIColor redColor];

您是否在设备旋转到横向时更新背景图层的框架? 显然你的问题可以从这个问题的答案中得到解决 here

您需要在设备旋转时添加新的渐变。

- (void)viewDidLayoutSubviews // called when device rotates
{
    [self.bgLayer removeFromSuperlayer]; // you need to keep reference so you can remove the old layer

    self.bgLayer = [BackgroundLayer blueGradient]; <---Calls method below
    self.bgLayer.frame = self.view.bounds;
    [self.view.layer insertSublayer:self.bgLayer atIndex:0];
}

看@WenchenHuang的回答,比我的方法好

简单方法:

只需将此添加到您的 viewcontroller

-(void)viewDidLayoutSubviews{
    self.bgLayer.frame = self.view.bounds;
}

更好的方法:

正如here描述的那样,你可以在这个way.I中使用我的Xcode测试它,它工作正常。

  1. 定义一个背景视图来管理大小

.h 文件

    #import <UIKit/UIKit.h>

    @interface BackgrundView : UIView

    @end

.m 文件

    #import "BackgrundView.h"      
    @interface BackgrundView()
    @end
    @implementation BackgrundView
    +(Class)layerClass{
        return [CAGradientLayer class];
    }
    @end

2 设置你想要的

#import "ViewController.h"
#import "BackgrundView.h"
@interface ViewController ()
@property BackgrundView * backgroundview;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.backgroundview = [[BackgrundView alloc] initWithFrame:self.view.frame];
    self.backgroundview.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self.view addSubview:self.backgroundview];
    UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0];
    UIColor *colorTwo = [UIColor colorWithRed:(57/255.0)  green:(79/255.0)  blue:(96/255.0)  alpha:1.0];

    NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
    NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
    NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];

    NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];
    CAGradientLayer * graintLayer = (CAGradientLayer *)self.backgroundview.layer;
    graintLayer.colors = colors;
    graintLayer.locations = locations;
}