【问题标题】:ios background color only appears on half of screen in landscape modeios背景颜色仅出现在横向模式下的一半屏幕上
【发布时间】:2015-06-23 22:53:03
【问题描述】:

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

 //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;

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

【问题讨论】:

  • 嗨,詹姆斯,看看我的更新,我发布了一个更好的方法来处理这个

标签: ios background landscape-portrait


【解决方案1】:

简单的方法:

只需将此添加到您的视图控制器

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

更好的方法:

正如hereDescribe,你可以这样做。我用我的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;
}

【讨论】:

  • self.bgLayer.frame = self.view.bounds;
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当设备旋转到横向时,您是否更新了背景层的框架? 显然你的问题可以从这个问题的答案here

    中得到解决

    【讨论】:

      【解决方案4】:

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

      - (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 的回答,比我的方法好。

      【讨论】:

      • bgLayer 没有 removeFromSuperLayer 方法
      • 对不起是removeFromSuperlayer
      • 我在这里放了一个断点,这个方法也会在开始时被调用。你能解释一下吗。这个方法有什么作用?
      • When the bounds change for a view controller's view, the view adjusts the positions of its subviews and then the system calls this method. 在视图加载后以及您的设备更改其旋转方向后多次调用它。
      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2013-01-27
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多