Вот решение проблемы с конфликтами masksToBounds, оно работает для меня.
После того, как вы установили corderRadius / borderColor / shadow и т. д., установите masksToBounds как NO:
v.layer.masksToBounds = NO;
Мы объясняем это ожиданием неопределенного поведения , а не какого-либо конкретного результата. Поскольку выражение пытается изменить x несколько раз без промежуточной точки последовательности , его поведение не определено .
Как говорили другие, стандарты C и C ++ не определяют поведение, которое это вызовет.
Но для тех людей, которые не понимают, почему стандарты делают такое. , давайте рассмотрим "реальный" пример:
1 * 2 + 3 + 4 * 5
Нет ничего плохого в вычислении 1 * 2 + 3
перед вычислением 4 * 5
. Тот факт, что умножение имеет более высокий приоритет, чем сложение, не означает, что нам нужно выполнить все умножение в выражении перед любым сложением. На самом деле существует множество различных порядков, в которых вы действительно могли бы выполнять свои вычисления.
Если оценки имеют побочные эффекты, разные порядки оценки могут повлиять на результат. Если стандарт не определяет поведение, не полагайтесь на него .
Фактически не определено. C ++ явно не определяет порядок выполнения оператора, поэтому он зависит от компилятора, и этот синтаксис использовать не следует.
Фрагмент кода вызовет Неопределенное поведение в обоих языках C / C ++. Прочтите о точке последовательности из здесь .