IOS: Почему у меня есть белые округлые углы на моем модальном представлении?

У меня есть модальный вид, появляющийся в моем приложении для iPad, и по какой-то причине он имеет белые округлые углы.

Возможно, стоит отметить, что я построил этот образ модели в своем раскадровке, а не программно. Однако, в моем методе viewWillAppear, я устанавливаю радиус угла так...

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.view.layer.cornerRadius = 6.0f;
}

Когда я устанавливаю значение выше 6, белые углы становятся видимыми. Как я могу установить значение выше, не показывая эти белые округлые углы?

Большое спасибо за вашу мудрость!

Ответ 1

Ваш вопрос неоднозначен в отношении того, какую презентацию вы используете для своего контроллера представлений, поэтому я собираюсь предположить, что вы используете лист формы. Решение состоит в том, чтобы установить цвет фона супервизора [UIColor clearColor], чтобы предотвратить появление полупрозрачного фона:

- (void) viewDidAppear:animated
{
    [super viewDidAppear:animated];

    self.view.layer.cornerRadius = 10;
    self.view.layer.masksToBounds = YES;
    self.view.superview.backgroundColor = [UIColor clearColor];
}

Перед установкой backgroundColor:

Before

После установки backgroundColor:

After

Ответ 2

Try

[self.view superview].layer.cornerRadius = 21.0f;
[self.view superview].layer.masksToBounds = YES;

Ответ 3

Я понимаю, что это старый вопрос, но он заслуживает ответа...

В iPad Модальные представления (с использованием UIModalPresentationFormSheet) имеют фон по умолчанию, который представляет собой изображение с белым краем с беловатыми углами ушатой собаки. В любом случае фон по умолчанию будет отображаться, если ваш фон модального просмотра имеет круглые или прозрачные углы.

Я потратил немало времени, пытаясь понять, как мне показывать фоновое представление, не имея фонового шоу по умолчанию. Хитрость заключается в том, чтобы сделать супервизор меньшим, чем ваш вид:

vc.view.clipsToBounds = NO;
vc.view.superview.bounds = CGRectMake(vc.view.superview.bounds.origin.x, vc.view.superview.bounds.origin.y, 300, 480);

ПРИМЕЧАНИЯ: vc - это представление, которое вы представляете. Не делайте вид слишком малым, иначе ваше событие касания не будет работать.

Ответ 4

Это странно. Попробуйте self.view.layer.masksToBounds = YES; тоже, если это работает. Вероятно, вы потеряете свои тени.

Подумайте об этом, эта белая вещь, вероятно, приходит из представления под вашей навигационной панелью.

Ответ 5

Попробуйте делегат приложения: [[self window] setBackgroundColor:[UIColor blackColor]];

Ответ 6

Я в моем случае белые вещи скрыты в тени тени на цвет фона слоя. Решенный путем изменения фона для очистки цвета:

//Monotouch code
View.Superview.Layer.BackgroundColor = UIColor.Red.CGColor;

Если он не избавится от белого угла, продолжайте поиск, не забудьте проверить некоторые свойства View, SuperView и BackgroundViews:

  • Цвет фона
  • Цвет фона слоя
  • Ширина и цвет границы слоя
  • Заголовок
  • Клип к границам

Примечание. DropShadow отображается как просмотр SuperView при ViewWillApper

Ответ 7

Я согласен с ответом @PeterPurple, но мне потребовалось некоторое время, чтобы придумать код, который действительно работал. В моем примере отображается модальное представление, которое центрируется по горизонтали, но поместите его ближе к верхней части экрана, чтобы представление не мешало клавиатуре. Конечно, я мог просто переместить представление, когда на клавиатуре появится, но я ленив. Во всяком случае, вот как я это сделал.

Я создал собственный modal segue и в этом segue я перепробовал выполнить: метод как таковой:

@implementation CustomSegue

static const CGFloat TOP_MARGIN = 40;
static const CGFloat SUPER_VIEW_GAP = 10;

- (void)perform {
    UIView *destView = [self.destinationViewController view];

    [self.destinationViewController setModalPresentationStyle:UIModalPresentationPageSheet];
    [self.destinationViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];

    CGFloat x, y, width, height, yCenter;
    CGSize contentSize = [self.destinationViewController contentSizeForViewInPopover];

    x = destView.superview.frame.origin.x;
    y = destView.superview.frame.origin.y;
    width = contentSize.width;
    height = contentSize.height;
    yCenter = (height / 2.0) + TOP_MARGIN;

    destView.superview.frame = CGRectMake(x + SUPER_VIEW_GAP, y + SUPER_VIEW_GAP, width - (SUPER_VIEW_GAP * 2), height - (SUPER_VIEW_GAP * 2));
    destView.superview.autoresizingMask = UIViewAutoresizingNone;
    destView.superview.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin;
    destView.superview.center = CGPointMake([[self.sourceViewController view] center].x, yCenter);
    destView.frame = CGRectMake(-SUPER_VIEW_GAP, -SUPER_VIEW_GAP, width, height);
}

Ответ 8

Чтобы сделать прозрачный вид модальности и сделать прозрачность до появления представления, нужно переместить self.view.superview.backgroundColor = [UIColor clearColor] из viewDidAppear в следующее:

  • (положений) viewWillLayoutSubviews { [super viewWillLayoutSubviews];

    self.view.superview.backgroundColor = [UIColor clearColor]; }

Ответ 9

Если вы используете диспетчер popoverpresentation для отображения своего контроллера представлений, попробуйте установить цвет фона для диспетчера popoverpresentation, чтобы очистить

    examplePopUpController = exampleViewController.popoverPresentationController!
    examplePopUpController?.backgroundColor = UIColor.clear