Простое autolayout не собирается делать это. Вы должны измерить, где был бы шпиндель, если бы он был частью исходного изображения, а затем математически поместить туда шпиндель, исходя из фактического размера представления изображения и места, в котором он помещает изображение в режиме содержимого.
Давайте сделаем это для одного шпинделя (левый шпиндель). Размещенное вами изображение кассеты 4824x2230. При тщательном осмотре мы обнаруживаем, что если изображение на кассете было показано в полном размере, центр шпинделя должен быть приблизительно (1294,1000), и он должен быть около 500 пикселей сбоку.
то же самое, что сказать, что мы хотим, чтобы изображение шпинделя занимало квадрат, чья рамка (относительно исходного изображения кассеты) равна (1045 750 500 500).
Хорошо, но это только изображение. Мы должны расположить шпиндель относительно изображения, которое его изображает.
Итак, сейчас я покажу кассету в виде изображения, размер которого определяется путем автоматического размещения до некоторого меньшего размера. (Я могу узнать , какой размер в viewDidLayoutSubviews
, который запускается после того, как autolayout сделал свою работу.) И пусть это представление изображения имеет режим содержимого Aspect Fit. Размер изображения будет изменен, а также его положение, вероятно, не будет в исходной точке просмотра изображения.
Итак, проблема, которую вы должны решить (в коде): теперь, где находится рамка шпинделя относительно вида изображения после изменения размера и изменения положения изображения? Затем вы просто помещаете туда вид изображения шпинделя.
Вот код из viewDidLayoutSubviews
; cassette
- это вид изображения кассеты, spindle
- это вид изображения шпинделя:
let cassettebounds = cassette.bounds
let cw = cassettebounds.width
let ch = cassettebounds.height
let w = 4824 as CGFloat
let h = 2230 as CGFloat
var scale = cw/w
var imw = cw
var imh = h*scale
var imx = 0 as CGFloat
var imy = (ch-imh)/2
if imh > ch { // we got it backwards
scale = ch/h
imh = ch
imw = w*scale
imy = 0 as CGFloat
imx = (cw-imw)/2
}
cassette.addSubview(spindle)
spindle.frame.size.width = 500*scale
spindle.frame.size.height = 500*scale
spindle.frame.origin.x = imx + (1045*scale)
spindle.frame.origin.y = imy + (750*scale)
Вот результат для 6s и 11 Pro:
Выглядит чертовски хорошо, если я сам так скажу. Правый шпиндель оставлен в качестве упражнения для читателя.