【问题标题】:CALayer autoresizing on iPhone/iPad: How?iPhone/iPad 上的 CALayer 自动调整大小:如何?
【发布时间】:2011-04-10 10:34:44
【问题描述】:

我正在尝试创建一个 UIView 子类(“GradientView”),它将用各种颜色的渐变填充自己。我通过添加一个 CAGradientLayer 作为 UIView 层的子层来实现它。

看起来不错,但是当屏幕旋转时,它没有调整渐变层的大小。没有运气在图层上找到要切换的 BOOL 属性,我覆盖了 GradientView 中的 layoutSubviews。

-(void)layoutSubviews {
    self.gradientLayer.frame = self.bounds;
}

这可行,但 GradientView 背后的东西在设备旋转动画期间仍然可见。 '自动调整' CAGradientLayer 以匹配其父层的边界以使动画平滑(如 UIView 自动调整大小)的最简单方法是什么?

【问题讨论】:

    标签: iphone ipad resize calayer autoresize


    【解决方案1】:

    您可能可以在自定义 UIView 上定义 +layerClass 方法...

    @implementation MyGradientView
    +(Class) layerClass {
        return [CAGradientLayer class];
    }
    @end
    

    您可以在控制器的 viewDidLoad() (或任何地方)中初始化图层,例如...

    -(void)viewDidLoad {
        [super viewDidLoad];
        [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
    }
    

    【讨论】:

    • +1 效果很好。图层大小由父 UIView 管理并自动调整大小。
    • 这个答案不是很清楚。我已经尝试了很多小时但没有工作
    • 效果很好!任何想在分组的 UITableViewCells 上使用它的人,不要忘记您需要将普通 UIView 子类化并设置为单元格的 backgroundView(而不是子类化单元格本身)。
    • 我认为这里缺少的信息是通过子类化此方法,您可以创建为视图创建的主要“层”层。由于它是视图的主要层,因此框架会根据需要为您自动调整大小。
    【解决方案2】:

    我愿意:

    1. 增加视图的大小到 willRotateToInterfaceOrientation 代码中每个维度的最大值。 (例如,对于 320x480 的 iPhone - 将暗淡设置为 480x480)。

    2. 根据 didRotateFromInterfaceOrientation 函数中新旋转的视图设置边界。

    这应该使视图足够大,这样无论它在动画期间如何定向,它都会覆盖整个屏幕。它不会“平滑”——因为必须旋转渐变,但至少在旋转中间你不会看到图层后面。

    【讨论】:

    • 好的 - 有更好的主意吗?我在制图程序中使用了这种技巧,我必须从 320x480 旋转到 480x320 并希望它看起来无缝。
    • 请参阅否决标准:stackoverflow.com/privileges/vote-down
    • 吸取的教训,布拉德你能编辑你的答案吗,(即使它只是大写一个单词),我会关掉 dv。 (投票被锁定,除非编辑)
    • 这有点小技巧,但是你可以将视图裁剪到它的范围内,它可以工作
    【解决方案3】:
    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    
        CGRect b;
    
        if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
        else b = CGRectMake(0, 0, 320, 480);    
    
        [CATransaction begin];
        [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
        [self.view.layer setBounds:b];
        [CATransaction commit];
    
    }
    

    【讨论】:

    • 为什么你认为我们必须明确地改变层的边界?当关联视图的框架发生变化时,图层应该自动调整大小,不是吗?
    【解决方案4】:

    请注意,仅当您将视图背景颜色设置为透明时,才能将 CAGradientLayer 作为图层类返回。如果您需要透明以外的颜色,则需要设置图层背景颜色。

    【讨论】:

      【解决方案5】:

      就我而言,这项工作:

      [[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
      

      【讨论】:

      • 我将您的代码添加到(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration。当我旋转时,旧图层仍然退出。横向模式下的新图层仍然出现。请帮帮我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多