iPad: конкретное / точное положение предметов для разных разрешений - PullRequest
0 голосов
/ 03 апреля 2019

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

См. Изображения (только быстрые примеры): самый маленький iPad (9,7 ") будет в правильном положении. Другое изображение (12,9") показывает неправильное положение. (Для всех размеров iPad я выбрал только два примера)

9,7 ": enter image description here 12,9 ": enter image description here

Я не могу найти способ или идею для решения этой проблемы позиционирования.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете сделать это, установив положение «луковицы» относительно размера изображения «план этажа».

Например:

  • предположим, что изображение вашего плана этажаэто 1800 x 1500, а ваши изображения колбы 96 x 96 (я оцениваю, основываясь на изображениях, которые вы разместили) ...
  • и, скажем, центр левого верхнего колпачка находится на 276, 486
  • и imageView, содержащий план вашего этажа, равен 900 x 750 (половина исходного размера)

. Вы должны установить:

xScale = 900 / 1800 (0.5)
yScale = 750 / 1500 (0.5)

bulb width = 96 * xScale
bulb height = 96 * yScale

bulb center = 276 * xScale, 486 * yScale

Вот пример кодаэто может помочь вам начать:

class FloorPlanViewController: UIViewController {

    @IBOutlet var floorPlanView: UIImageView!

    var bulbs: [UIImageView] = [UIImageView]()

    var centers: [CGPoint] = [
        CGPoint(x: 276, y: 486),
        CGPoint(x: 276, y: 648),
        CGPoint(x: 640, y: 486),
        CGPoint(x: 640, y: 648),
        CGPoint(x: 877, y: 486),
        CGPoint(x: 877, y: 648),
        ]

    override func viewDidLoad() {
        super.viewDidLoad()

        for _ in centers {
            let v = bulbImageView()
            floorPlanView.addSubview(v)
            bulbs.append(v)
        }

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        if let fpImage = floorPlanView.image {

            let xScale = floorPlanView.frame.width / fpImage.size.width
            let yScale = floorPlanView.frame.height / fpImage.size.height

            for i in 0..<centers.count {

                let thisCenter = centers[i]
                let thisBulb = bulbs[i]

                thisBulb.frame.size.width = 96.0 * xScale
                thisBulb.frame.size.height = 96.0 * yScale

                thisBulb.center = CGPoint(x: thisCenter.x * xScale, y: thisCenter.y * yScale)

            }
        }

    }

    func bulbImageView() -> UIImageView {
        let v = UIImageView()
        if let img = UIImage(named: "bulb96x96") {
            v.image = img
        } else {
            v.backgroundColor = .red
        }
        return v
    }

}
0 голосов
/ 03 апреля 2019

Да, это будет сложно, потому что на добавленных скриншотах изображения выглядят так, что они соответствуют размеру экрана, а это означает, что их содержимое трансформируется в рамку.В этом случае вам нужно будет рассчитать коэффициент преобразования между фактическим размером изображения и размером кадра и обновить позиции вашего дочернего вида до нового соотношения.

Один из вариантов - встроить изображение в вид прокрутки, чтобы оно соответствовало полноразмерной высоте и ширине изображения.В этом случае у вас всегда будет соотношение сторон 1: 1, и вам не придется перемещать дочерние представления.Однако для просмотра изображения вам необходимо прокрутить прокрутку.

...