Когда происхождение «границ» UIView увеличивается с положительными числами, почему подпредставления сдвигаются в отрицательном направлении? - PullRequest
0 голосов
/ 15 октября 2018

Это должно быть что-то действительно простое, и мои базовые математические знания могут отсутствовать.Это ясно (из этого вопроса ):

Кадр представления определяет его расположение в суперпредставлении .Границы представления определяют его местоположения подпредставлений .Это означает, что если вы измените границы представления, его местоположение не изменится, но изменится все расположение его подпредставлений.

Контроллер представления после запуска приложения Single View:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let v1 = UIView(frame: CGRect(x: 100, y: 100, width: 200, height: 300))
        v1.backgroundColor = UIColor.blue

        let v2 = UIView(frame: v1.bounds.insetBy(dx: 50, dy: 50))
        v2.backgroundColor = UIColor.red

        self.view.addSubview(v1)
        v1.addSubview(v2)
    }

Проверка на консоли LLDB также совершенно ясна:

(lldb) p v1.frame
(CGRect) $R0 = (origin = (x = 100, y = 100), size = (width = 200, height = 300))
(lldb) p v1.bounds
(CGRect) $R1 = (origin = (x = 0, y = 0), size = (width = 200, height = 300))

(lldb) p v2.frame
(CGRect) $R2 = (origin = (x = 50, y = 50), size = (width = 100, height = 200))
(lldb) p v2.bounds
(CGRect) $R3 = (origin = (x = 0, y = 0), size = (width = 100, height = 200))

A red square positioned in the middle of a blue square

Добавление v1.bounds.origin.x += 50 (или v1.bounds.origin.x = 50 в этом отношении) после v1.addSubview(v2) приводит к:

(lldb) p v1.frame
(CGRect) $R0 = (origin = (x = 100, y = 100), size = (width = 200, height = 300))
(lldb) p v1.bounds
(CGRect) $R1 = (origin = (x = 50, y = 0), size = (width = 200, height = 300))

(lldb) p v2.frame
(CGRect) $R2 = (origin = (x = 50, y = 50), size = (width = 100, height = 200))
(lldb) p v2.bounds
(CGRect) $R3 = (origin = (x = 0, y = 0), size = (width = 100, height = 200))

Вывод консоли LLDB все еще согласуется с моим текущим пониманием, но тогда он выглядит так:

Red square lined up with the left wall of the blue square

Почему? Попытка рассуждать об этом (см. Ниже), и я понимаю, что системы координат представлений относительно друг друга, но если добавить 50до v1 origin.x, эффективность подпредставлений frame.origin должна быть (x=50+50, y=0).

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я нашел удовлетворительный ответ в книге Мэтта Нойбурга «Программирование на iOS 11» с похожим примером:

/* ... */
let v2 = UIView(frame:v1.bounds.insetBy(dx: 10, dy: 10))
/* ... */
v1.bounds.origin.x += 10
v1.bounds.origin.y += 10

Ничего не происходит с размером или положением суперпредставления.Но подпредставление переместилось вверх и влево, чтобы оно находилось на одном уровне с верхним левым углом суперпредставления.По сути, мы сделали, чтобы сказать суперпредставлению: «Вместо вызова точки в левом верхнем углу (0.0,0.0), назовите эту точку (10.0,10.0)». Поскольку кадр подпредставленияПроисхождение находится в (10.0,10.0), подпредставление теперь касается верхнего левого угла суперпредставления.Эффект от изменения источника границ представления может показаться направленным назад - мы увеличили происхождение суперпредставления в положительном направлении, но подвид переместился в отрицательном направлении - но подумайте об этом так: точка начала границ представления совпадает с верхней левой частью кадра.

Поэтому кажется, что изменение origin больше похоже на операцию отображения, чем на преобразование системы координат.Это также объясняет, почему результаты одинаковы для += 50 и = 50.

enter image description here

0 голосов
/ 15 октября 2018

Регулируя bounds ' origin.x в v1, вы расширяете источник за пределы видимого прямоугольника.(Вот как работает UIScrollView.)

Если вместо этого изменить origin.x фрейма фрейма, я думаю, вы увидите результаты, более соответствующие вашим ожиданиям.

...