これはiPhoneの画面の大きさに合わせてキャプチャのプレビューを配置する部分ですが、提供されているサンプルはデバイスの縦持ち(portrait)にしか対応していませんでしたので、横持ち(landscape)にも対応するようにこれを修正します。
func updateLayerGeometry() {
let bounds = rootLayer.bounds // iOS用
//横持ち用
var scale: CGFloat
let xScale: CGFloat = bounds.size.width / bufferSize.width //.height
let yScale: CGFloat = bounds.size.height / bufferSize.height //.width
scale = fmax(xScale, yScale)
if scale.isInfinite {
scale = 1.0
}
//縦持ち用
var scalePortrait: CGFloat
let xScalePortrait: CGFloat = bounds.size.width / bufferSize.height
let yScalePortrait: CGFloat = bounds.size.height / bufferSize.width
scalePortrait = fmax(xScalePortrait, yScalePortrait)
if scalePortrait.isInfinite {
scalePortrait = 1.0
}
//
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
switch UIApplication.shared.statusBarOrientation {
case .portrait:
print("updateLayerGeometry: statusBarOrientation.portrait")
detectionOverlay.bounds = CGRect(x: 0.0, y: 0.0, width: bufferSize.height, height: bufferSize.width)
detectionOverlay.setAffineTransform(CGAffineTransform(rotationAngle: 0.0).scaledBy(x: scalePortrait, y: -scalePortrait))
case .landscapeLeft:
print("updateLayerGeometry: statusBarOrientation.landscapeLeft")
detectionOverlay.bounds = CGRect(x: 0.0, y: 0.0, width: bufferSize.width, height: bufferSize.height)
detectionOverlay.setAffineTransform(CGAffineTransform(rotationAngle: 0.0).scaledBy(x: scale, y: -scale))
case .landscapeRight:
print("updateLayerGeometry: statusBarOrientation.landscapeRight")
detectionOverlay.bounds = CGRect(x: 0.0, y: 0.0, width: bufferSize.width, height: bufferSize.height)
detectionOverlay.setAffineTransform(CGAffineTransform(rotationAngle: 0.0).scaledBy(x: scale, y: -scale))
case .portraitUpsideDown:
print("updateLayerGeometry: statusBarOrientation.portraitUpsideDown")
detectionOverlay.bounds = CGRect(x: 0.0, y: 0.0, width: bufferSize.height, height: bufferSize.width)
detectionOverlay.setAffineTransform(CGAffineTransform(rotationAngle: 0.0).scaledBy(x: scalePortrait, y: -scalePortrait))
default: //break
detectionOverlay.setAffineTransform(CGAffineTransform(rotationAngle: CGFloat(.pi / 2.0)).scaledBy(x: scale, y: -scale))
}
// center the layer
detectionOverlay.position = CGPoint(x: bounds.midX, y: bounds.midY)
CATransaction.commit()
}
タグ:vision