使视图变暗,就像禁用一样

Posted

技术标签:

【中文标题】使视图变暗,就像禁用一样【英文标题】:Darken view as if disabled 【发布时间】:2013-03-17 16:32:20 【问题描述】:

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

我的意思是UIView,以及它的所有子代。我想达到与禁用/突出显示UIButton 相同的效果。

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

【问题讨论】:

说真的????这个问题有 11.9k 的声誉???? o.O 还是我把这个问题弄错了? :o @HinataHyuga 11.9k-> 表示你不能提问?他可能擅长另一种语言并且是 ios 新手?你永远不知道... @HinataHyuga 有时我会问一些关于我已经解决的问题的问题,以学习解决问题的新方法。如果没有人回复,我会发布我的解决方案。我不会立即这样做以避免偏见。 @lakesh 我不是 iOS 新手。我只是想对这个问题有不同的看法。 @hpique 学习任何问题的不同方法的好方法。 :) 【参考方案1】:

我目前在玩什么:

    创建一个不透明的黑色层 (_highlightLayer)。这类似于“带有 alpha 的黑色视图”方法。 用原始视图的非透明图像遮罩_highlightLayer。 将_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;

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

【讨论】:

这实际上正是我想要的。【参考方案2】:

例子:

你有一个 UIButton *button1 和 UIView *view1

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

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

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

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

希望这会有所帮助..

【讨论】:

这不是我问的。顺便说一句,您应该使用setEnabled 禁用按钮。我想说setHiddensetAlpha 更受欢迎(除非你想要一个淡入淡出动画,在这种情况下你需要两者)。【参考方案3】:

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

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

【讨论】:

谢谢。但是这种方法假设 UIView 是完全不透明的,这是一个很大的限制。 编辑了原始问题以澄清。

以上是关于使视图变暗,就像禁用一样的主要内容,如果未能解决你的问题,请参考以下文章

通过 subView 禁用触摸视图

如何在不使项目变灰的情况下禁用 UITabBarItem

如何在不像 Whatsapp 那样遮挡整个屏幕的情况下禁用表格视图?

为啥我的 iOS 应用没有禁用暗模式?

如何禁用活动中的主页按钮单击 - 就像在锁屏应用程序中一样?

为啥 iOS 会禁用动画?