0

私はこのプロジェクトに取り組んでおり、ストーリーボードに 1 つのシーンがあります。

シーンは TableViewController です。

  • テーブル ビューにはカスタム プロトタイプ セルがあります (CustomCell.swift にリンクされています)。

    • プロトタイプ セル内には、ラベルとカスタム UIView (CustomView.swift にリンク) があります。これらの要素には、プロトタイプ セルの contentView に関連するレイアウトの制約があります。

ここで、ビューのサイズが変更されたときにカスタム ビューに描画されているものを変更して、デバイスが回転したときにその新しいセル幅に調整されるようにします。制約により、デバイスが回転した後に CustomCell のサイズが変更されると、CustomView のフレームが変更されます。これを検出するために、2 つのプロパティ オブザーバーを CustomView.swift に追加しました。

override var frame: CGRect {
    didSet {
        print("Frame was set!")
        updateDrawing()
    }
}

override var bounds: CGRect {
    didSet {
        print("Bounds were set!")
        updateDrawing()
    }
}

プロジェクトを実行しているときに、デバイスを回転させると、2 番目のオブザーバーが正常に動作します。最初の観察者はしません。私の質問は、最初のオブザーバーがフレームが変更されたことを検出しないのはなぜですか?

4

1 に答える 1

2

.frame はビュー (および変換) の .bounds と .center から計算されるため、変更されません。回転に反応するには、これをオーバーライドします (iOS8 以降):

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition({ (coordinator) -> Void in
        // do your stuff here
        // here the frame has the new size
    }, completion: nil)
}
于 2016-03-21T20:26:15.840 に答える