Тусклый фон iOS при отображении представления - PullRequest
20 голосов
/ 05 июля 2011

На моем главном экране я выполняю жестовое действие, заставляющее отображать новый вид. В настоящее время я хочу затемнить весь фон (кроме этого нового представления) в качестве хорошей практики пользовательского интерфейса. В HTML Javascript это выглядит так - Как получить такой же эффект в iOS?

enter image description here

Ответы [ 4 ]

33 голосов
/ 05 июля 2011

Поместите UIView поверх фона, установите его фон на [UIColor blackColor] и установите его непрозрачность как 0,6.Затем добавьте этот UIView к родительскому представлению.

Это затемнит фон и перехватит любые нажатия на элементы управления фоном.

5 голосов
/ 05 июля 2011

Пока предложение Дэна нацелено, вы не можете использовать модальный контроллер вида в этом случае, потому что типичный модал покрывает весь экран, блокируя родительский контроллер вида, даже если у вас фон вашего представления прозрачен ( увидеть все, что у вас есть в UIWindow приложения).

Если вы делаете это на iPad, есть 2 стиля модальной презентации (UIViewModalPresentationStylePageSheet и UIViewModalPresentationStyleFormSheet), которые могут делать что-то похожее, но они не будут работать на iPhone или iPod Touch.

Добавьте «теневой» вид с темным фоном, частичной непрозрачностью и любым видом, который вы хотите видеть на переднем плане, непосредственно в вид контроллера представления. Вы можете анимировать их, используя стандартные блоки анимации UIView или CoreAnimation.

Еще одно замечание: если вы хотите перехватить прикосновения к этому теневому виду, вы можете либо сделать его гигантской кнопкой, создать подкласс UIView, чтобы переопределить один из сенсорных методов, таких как touchesEnded:, или изменить его на UIControl, который может принимать сенсорные события, такие как UIButton, но без дополнительных опций для текста, теней, состояний и т. д.

1 голос
/ 11 января 2016
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIGestureRecognizerDelegate>
{
    UIView *mainView;
    UIView *dimBackgroundUIView;
    UIView *customView;

    UIButton *btn;
}

@end


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    mainView = [[UIView alloc] init];
    mainView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:mainView];
    [self addConstraintsForMainView];

    btn = [[UIButton alloc] initWithFrame:CGRectMake(200, 200, 100, 30)];
    [btn setTitle:@"Button" forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor blueColor]];
    [btn addTarget:self action:@selector(showCustomView_Action:) forControlEvents:UIControlEventTouchUpInside];
    [mainView addSubview:btn];

    dimBackgroundUIView = [[UIView alloc] init];
    dimBackgroundUIView.backgroundColor = [UIColor blackColor];
    dimBackgroundUIView.alpha = 0.2;
}

-(void)removeCustomViewsFromSuperView {

    if(dimBackgroundUIView)
        [dimBackgroundUIView removeFromSuperview];

    if(customView)
        [customView removeFromSuperview];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)showCustomView_Action:(id)sender {

    customView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 80, 80)];
    customView.backgroundColor = [UIColor redColor];

    [self.view addSubview:dimBackgroundUIView];
    [self addConstraintsForDimView];

    [self.view addSubview:customView];

    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeCustomViewsFromSuperView)];
    tapped.delegate=self;
    tapped.numberOfTapsRequired = 1;
    [customView addGestureRecognizer:tapped];
}

-(void) addConstraintsForDimView {

    [dimBackgroundUIView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
}

-(void) addConstraintsForMainView {

    [mainView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
}

@end

примечание: вы можете оптимизировать код с помощью графического интерфейса в Xcode, но мне пришлось писать код программно, чтобы иметь возможность его протестировать

так что идея состоит в том, чтобы:

  1. создать UIView назвать его, что вы хотите (dimBackgroundUIView), чем установить цвет фона - черный и установите альфа на 0,1 или 0,2 или ....
  2. добавьте эти 2 строки кода, когда вам нужно затемнить фон: [self.view addSubview: dimBackgroundUIView]; [self addConstraintsForDimView];
  3. и добавьте эти 2 строки кода, если вы хотите убрать затемнение background: if (dimBackgroundUIView) [dimBackgroundUIView removeFromSuperview];
1 голос
/ 24 сентября 2014

Приведенные выше два ответа работают, если новое представление имеет свой собственный «фон», то есть не имеет прозрачности.Проблема, которая привела меня сюда, не может быть решена таким образом, поэтому я пытался сделать следующее: на моем экране AVCaptureSession с обычным AVCaptureVideoPreviewLayer для отображения видео в реальном времени.Я хочу выбрать часть экрана (чтобы потом что-то сделать только с этой частью), а когда эта часть выбрана, нужно затемнить остальную часть предварительного просмотра видео.Вот как это выглядит:

Вот как я решил это: новый вид создается в зависимости от того, где экран коснулся и добавлен как подпредставление предварительного просмотра видеоПосмотреть.Затем я создаю 4 дополнительных непересекающихся прямоугольных подпредставления с вышеупомянутым цветом фона и непрозрачностью, чтобы покрыть остальную часть экрана.Мне явно нужны все эти виды , а не , чтобы быть подпредставлениями основного вида, потому что мне нужна возможность коснуться экрана где-нибудь еще и изменить выбранную область.

Я уверен, что естьБолее элегантные способы решить эту проблему, поэтому, если кто-то знает, как это сделать, пожалуйста, прокомментируйте ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...