In meiner UIViewController
habe ich eine einzelne Unterklasse von UIView
, in der ich ein Tic Tac Toe Board zeichnen werde. Irgendwie teilen die Teiler (die "#" Form), die ich mit UIBezierPath()
zeichne, die Tafel nicht gleichmäßig. Anstelle von 1/3-1/3-1/3 liegen die vertikalen Teiler näher bei 45% -45% -10%, obwohl die Ausdrucke der Abmessungen sinnvoll sind. Was vermisse ich? DankWie zeichnet man Tic Tac Toe Board als UIView in swift?
In meiner Unterklasse:
import UIKit
@IBDesignable class GameBoardView: UIView {
override func drawRect(rect: CGRect) {
// set up gameBoard dimensions everytime drawRect() is called
setUpGameBoardCells()
self.frame = CGRectMake(gameBoardPosX, gameBoardPosY, gameBoardLength, gameBoardLength)
print("gameBoard.frame: x=\(self.frame.origin.x), y=\(self.frame.origin.y), h=\(self.frame.height), w=\(self.frame.width)\n")
// draw dividers & cells
var divider = UIBezierPath(rect: CGRect(x: cellWidth, y: 0, width: dividerWidth, height: gameBoardLength))
divider.lineWidth = 1
UIColor.orangeColor().setStroke()
divider.stroke()
divider = UIBezierPath(rect: CGRect(x: cellWidth * 2 + dividerWidth, y: 0, width: dividerWidth, height: gameBoardLength))
divider.stroke()
}
}
Und das ist, wie ich die Dimensionen eingerichtet jeder Größe Bildschirme zu handhaben:
var screenSize = CGRect()
let screenMargin: CGFloat = 20 // to the edge
var gameBoardIsPortrait = Bool()
var gameBoardLength = CGFloat()
var gameBoardPosX = CGFloat()
var gameBoardPosY = CGFloat()
let cellsPerRow: Int = 3
var cellWidth = CGFloat()
let dividerWidthGuide: CGFloat = 0.02 // guideline % of gameBoardLength
var dividerWidth = CGFloat()
let debugPrint = true
func setUpGameBoardCells() {
screenSize = UIScreen.mainScreen().bounds
// gameBoard is a square
gameBoardIsPortrait = (screenSize.height >= screenSize.width ? true : false)
gameBoardLength = min(screenSize.height, screenSize.width) - screenMargin * 2
gameBoardPosX = (screenSize.width - gameBoardLength)/2
gameBoardPosY = (screenSize.height - gameBoardLength)/2
// want cells & dividers on gameBoard to be whole numbers
dividerWidth = round(gameBoardLength * dividerWidthGuide)
let cellsTotalWidth: Int = Int(gameBoardLength) - Int(dividerWidth) * (cellsPerRow - 1)
let dividerWidthFudge: CGFloat = (cellsTotalWidth % cellsPerRow == 1 ? -1 : (cellsTotalWidth % cellsPerRow == 2 ? 1 : 0))
dividerWidth += dividerWidthFudge
cellWidth = CGFloat((cellsTotalWidth - Int(dividerWidthFudge) * (cellsPerRow - 1))/cellsPerRow)
if debugPrint {
print("setUpCellDivision()->\nscreen: h=\(screenSize.height), w=\(screenSize.width)")
print("gameBoardIsPortrait=\(gameBoardIsPortrait), gameBoardLength=\(gameBoardLength), gameBoardPosX=\(gameBoardPosX), gameBoardPosY=\(gameBoardPosY)")
print("cellWidth=\(cellWidth), dividerWidth=\(dividerWidth)\n")
}
}
Was seltsam ist, dass in Xcode es sieht recht:
Aber im Simulator sieht es aus dies wie:
Hallo Rob, vielen Dank für Ihre Antwort. Ich bestätige, indem ich CGRectMake() aus drawRect() heraushole, die Teiler nun an den richtigen Stellen erscheinen. Wenn ich immer noch die Größe des Boards programmgesteuert ändern und an einen bestimmten Ort verschieben möchte, wo sollte ich den Aufruf von CGRectMake() einfügen? Ich habe versucht, es in ViewWillAppear() in meinem ViewController zu setzen, aber das scheint nicht zu funktionieren. Danke – rockhammer
Sie konfigurieren das 'frame' wie Sie jede andere Ansicht.Wenn Sie das automatische Layout verwenden und es in einem Storyboard hinzugefügt haben, fügen Sie einfach Outlets für die Constraints hinzu, und Sie können dann die Eigenschaft "constant" der Constraints entsprechend anpassen. Der Schlüssel ist, dass wenn Sie das automatische Layout verwenden, der 'Rahmen' nicht direkt angepasst wird. Passen Sie die Einschränkungen an. – Rob
Einschränkungen! Na sicher. Danke, Rob, ich habe es gerade zur Arbeit gebracht. – rockhammer