3

您如何使视图变暗,就好像它被禁用/突出显示一样,最好不使用任何其他视图?

通过视图,我的意思是 a UIView,及其所有子级。我想达到与 disabled/highlighted 相同的效果UIButton

不要假设视图是完全不透明的。

4

3 回答 3

8

我目前正在玩的东西:

  1. 创建一个不透明度的黑色层 ( _highlightLayer)。这类似于“带有 alpha 的黑色视图”方法。
  2. _highlightLayer使用原始视图的非透明图像遮罩。
  3. 添加_highlightLayer到视图的图层。

只有视图的不透明像素会变暗。

编码:

- (void)highlight
{
    // Black layer with opacity
    _highlightLayer = [CALayer layer];
    _highlightLayer.frame = CGRectMake(0, 0, self.layer.bounds.size.width, self.layer.bounds.size.height);
    _highlightLayer.backgroundColor = [UIColor blackColor].CGColor;
    _highlightLayer.opacity = 0.5;

    // Create an image from the view        
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *maskImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Create a mask layer for the black layer 
    CALayer *maskLayer = [CALayer layer];
    maskLayer.contents = (__bridge id) maskImage.CGImage;
    maskLayer.frame = _highlightLayer.frame;

    _highlightLayer.mask = maskLayer;
    [self.layer addSublayer:_highlightLayer];
}

进而:

- (void)unhighlight
{
    [_highlightLayer removeFromSuperlayer];
    _highlightLayer = nil;
}

当然,这应该只用于小视图。

于 2013-03-20T16:05:54.767 回答
0

例子:

你有一个 UIButton *button1 和 UIView *view1

您可以通过以下方式禁用按钮和视图:

[view1 setHidden:YES];
[button1 setEnabled:NO];

可以通过以下方式启用按钮和视图:

[view1 setHidden:NO];
[button1 setEnabled:YES];

希望这可以帮助..

于 2013-03-17T17:01:28.630 回答
0

虽然这种方法无法满足您不使用额外视图的偏好,但简单地添加一个 alpha 为 0.6 左右的黑色视图似乎可以达到效果,另外还有一个好处是您可以使用这个新视图来拦截 UIEvents 以便所有子视图有效地被集体禁用。

您甚至可以在图形上获得精美的效果,而不仅仅是为覆盖视图使用黑色背景,您可以使用径向渐变填充其背景,以实现当弹出视图禁用其后面的视图时在 iOS 中发生的那种聚光灯效果。 .

于 2013-03-17T19:24:29.587 回答