/ / Programowe automatyczne układanie tablicy obrazów w różnych rozmiarach - swift, uiimageview, autolayout, swift4, ios-autolayout

Programowalny układ automatyczny tablicy obrazów w różnych rozmiarach - szybki, uiimageview, autolayout, swift4, ios-autolayout

Robię łamigłówkę 2D (siatka / plansza) Sokoban, jeśli ktoś o tym słyszał, poniżej jest kod. Szukam sposobu na wyświetlenie planszy (tablicy obrazów).

func makeLevel() {
var cellImageView: [[UIImageView]] = []
var floorImageView: [[UIImageView]] = []
let cellWidth = 35
let cellHeight = 35

let x0 = 190 - 4 * cellWidth
let y0 = 300 - 4 * cellHeight

let imageForCellMarker: [Character: UIImage] = [
".": UIImage(named: "poopgoal30x30")!,
"#": UIImage(named: "wall30x30")!,
"$": UIImage(named: "box30x30")!,
"@": UIImage(named: "cat30x30")!,
"£": UIImage(named: "box30x30")!,
"&": UIImage(named: "cat30x30")!,
]

//Floor
for y in 0..<rows {
floorImageView.append([])
for x in 0..<cols {
let image = UIImage(named: "floor30x30")!
let frame = CGRect(x: x0 + x * cellWidth, y: y0 + y * cellHeight,         width: cellWidth, height: cellHeight)
let imageView = UIImageView(frame: frame)
imageView.image = image
floorImageView[y].append(imageView)
view.addSubview(imageView)
}
}

//Level
for y in 0 ..< rows {
cellImageView.append([])
for x in 0 ..< cols {
let image = imageForCellMarker[gameBoard[y][x]]
let frame = CGRect(x: x0 + x * cellWidth, y: y0 + y * cellHeight, width: cellWidth, height: cellHeight)
let imageView = UIImageView(frame: frame)
imageView.image = image
cellImageView[y].append(imageView)
view.addSubview(imageView)
}
}
}

Ponieważ plansza będzie w różnych rzędacha kolumny zależą od poziomu, więc naprawdę nie mogę ustawić go na stałe w widoku. Czy jest więc jakiś z was, szybkich ekspertów, który pokaże mi, jak mogę automatycznie rozmieścić siatkę, aby pasowała do wszystkich urządzeń?

Odpowiedzi:

0 dla odpowiedzi № 1

Radziłbym używać automatycznego układu i ograniczeń zamiast wartości bezwzględnych ... co pozwoliłoby uniknąć konieczności ręcznego obliczania rozmiarów i pozycji.

Aby zdobyć obecny aby wyśrodkować „obszar gry”, możesz zmienić te dwie linie:

    let x0 = 190 - 4 * cellWidth
let y0 = 300 - 4 * cellHeight

do (zakładam, że 4 powyżej to liczba wierszy i kolumn):

    let x0 = Int(view.frame.size.width) / 2 - cols * cellWidth / 2
let y0 = Int(view.frame.size.height) / 2 - rows * cellHeight / 2

Więc...

cols * cellWidth      // equals the full width of the game area
rows * cellHeight     // equals the full height of the game area

cols * cellWidth / 2    // equals one-half the width of the game area
rows * cellHeight / 2   // equals one-half the height of the game area

Int(view.frame.size.width) / 2   // equals the horizontal center of the view
Int(view.frame.size.height) / 2  // equals the vertical center of the view

aby wyśrodkować obszar gry w widoku, ustaw początkowy X na środek X - połowę szerokości obszaru gry, a początkowy Y ustaw na środku Y - połowę wysokości pola gry .

Spowoduje to wyśrodkowanie obszaru gry, niezależnie od urządzenia. Jednak w przypadku większych urządzeń będzie to mały obszar pośrodku całkowitego widoku ... więc musisz obliczyć cellWidth i cellHeight wartości oparte na rozmiarze ekranu / widoku.