今回の記事はSwiftを使ってカメラ操作を行いカメラ画面を横画面にできるところまでの記事です。なかなか参考記事も少なく、また、参考記事の通りに行っても、うまくいかないという事態が起きていたのでその際の回避方法も併せて記載しています。
AVCaptureVideoPreviewLayerでの横画面対応コード編集失敗
このクラスはビデオ映像関連の全てをになっていると考えてもいいと思われます。
ここの内部で下記コードを実行して表示を変更すればカメラ画面を横向きにできると記載ある記事が多くこれにしたがったのですができませんでした。
layer.connection(with: .video)?.videoOrientation = .portrait
//下 .portrait→.landscapeLeft
layer.connection(with: .video)?.videoOrientation = .landscapeLeft
こちらはカメラ操作用のviewcontrollerとは別のファイル内に記載のあったクラスの内での変更したのですが、これでは画面の表示はそのままでした。。
そもそもlayerがconnectメソッドに対応できていないのか、強制型の「!」をつけるとエラーになりnil許容型の「?」をつけてエラーを回避していたのですが、値をみるとnilになっており、その原因が全くわからない状況でした。。
(ちなみに、layerは他のメッソドどは通常の働きをしてくれています。例えば画面をスクリーンいっぱいに自動で調節してくれる「videoGravity」とか。)
もしかしたらここが別ファイルになっていたとこが今思えば原因なのかも。わかる人教えてください。。
てなわけで時間もなかったのでこの原因はまた調べるとして次に他の方法を模索。
そもそも画面を横に対応させずにした場合はiPhoneを傾けると画面も追従してくるということは傾きを検知させる何かがいて、その何かが傾きによって画面の見える部分を移動させているということは何となく分かったので、その画面の見える部分が「何か」、また、その「画面の方を補正してカメラの角度に対応」させればいいんじゃないかと考え下記に進みます。
previewView(UIImage)90度傾けて横画面対応
こちらはUIimageのクラス、つまり画面表示のをになっているクラスです。
カメラ映像が全てPreviewViewに表示されている仕組みとStoryboardから読み解いたので、この画面を90度傾けようと考えました。
ちなみに本当にこのpreviewViewがカメラ映像の表示かを確認する際に一度このPreviewViewを出力しているところであえてPreviewViewを表示させない様に変更したところ、真っ黒の画面が表示され画面表示をになっていることを突き止めました。
またこれも補足ですが、previewViewを消してもカメラの映像は入力されている様でしたのでこのクラスは画面表示のみをになっていることもこれでわかります。
imageを傾けるのみだとそこまで難しくありません。
画面表示関連はviewcontrollerで実装する必要があるので、viewcontrollerの本当にした部分のページが読み込まれた際にすぐ実行される部分に下記を付け加えます。
override func viewDidLoad() {
super.viewDidLoad()
let angle = 90 * CGFloat.pi / 180
var transRotate = CGAffineTransform()
transRotate = CGAffineTransform(rotationAngle: CGFloat(angle));
previewView.transform = transRotate
...
}
このコードはangleで角度を記載してその角度回転させるという簡単なものでネットからの広いもんですがいい感じに働いており、表示が横画面でも違和感なく動いていることがかくにんできております。
コメント