2022年02月26日

アップルのMLサンプルの updateLayerGeometry() 修正する

前回に引き続き、さらにアップルのサンプルを修正します。それは updateLayerGeometry() です。
これは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
posted by MacLab. at 22:36| Comment(0) | TrackBack(0) | 技術情報
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/189362475
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック