回転ロックボタンをつくりたくて Single View Applicationテンプレートでその機能だけを試しているのですが、思うように動きません。

つくろうとしている回転ロックボタンの特徴は、

1 アプリ起動時、ユーザは自由にデバイスを回転させ、ビューを縦向き(縦長)でも、横向き(横長)でも表示させることができる。

2 好きな向きが決まったら、回転ロックボタンをタップして、ビューを固定できる。

3 回転ロック状態では、デバイスを回転させても、ビューは回転しない。

4 回転ロックボタンを再度タップすると、ロックが解除され、デバイスの回転に合わせてビューも横向き表示になったり縦向き表示になったりする。(起動時の状態に戻る)

というものです。

自力でつくってみたコードでは、

Initial ViewController.swift ファイルに、

var lock: Bool! // 回転ロックのオン/オフを識別
var rotationValue: Int! // UIDeviceのsetValueメソッドで使う値

と、プロパティを用意して、viewDidLoadメソッドでは、

lock = false

NSNotificationCenter.defaultCenter().addObserver(self,
  selector: "rotated",
  name: UIDeviceOrientationDidChangeNotification,
  object: nil)

と、デバイスの回転を認識できるようにしました。
また、rotated関数は、

func rotated() {
  if UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation) {
    if UIDevice.currentDevice().orientation == .LandscapeLeft {
      if lock == false {
        rotationValue = UIInterfaceOrientation.LandscapeRight.rawValue
      }
    } 
    else if UIDevice.currentDevice().orientation == .LandscapeRight {
      if lock == false {
        rotationValue = UIInterfaceOrientation.LandscapeLeft.rawValue
      }
    }
  }
  if UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation) {
    if UIDevice.currentDevice().orientation == .Portrait {
      if lock == false {
        rotationValue = UIInterfaceOrientation.Portrait.rawValue
      }
    }
    // Portraitの Upside Downは、
    // プロジェクトのGeneralタブ内でオフにしています。
  }
  UIDevice.currentDevice().setValue(rotationValue, forKey: "orientation")
}

としました。回転ロックボタンのアクションは以下の通りです。

@IBAction func buttonTapped(sender: AnyObject) {
  rotationValue = !rotationValue
}

なお、storyboardには、回転ロックボタン用の UIButton と、縦向き表示と横向き表示で内容の変わる UILabel を設置し、制約でオートレイアウト対応してあります。

これで一応、ポートレートのときには縦向きビュー、ランドスケープのときには横向きビューにすることができるのですが、問題があります。

たとえば、縦向きビューに固定して、デバイスを横向きにした場合、ビューが一旦横向きになってから縦向きに戻る、という動作をしてしまいます。最終的には定位置になるのですが、ビューが無駄にぐるぐるするのが困ります。

回転を全くさせずにしっかりビューを固定するには、どうしたらいいのでしょう?

overrideするメソッドの、
shouldAutorotate()
supportedInterfaceOrientations()
preferredInterfaceOrientationForPresentation()
を使うことも考えましたが、これらを使うとシーンの縦横表示がどちらかに完全に固定されてしまうようで、「ユーザが好きな向きを選べる」ようにする使い方が分かりませんでした。

縦向き表示、横向き表示どちらにも対応するアプリ内に設置する、ユーザが好きなときに好きな向きで回転ロックできる機能をもつボタンをどうしたらつくれるか、教えていただけませんか?

上記コードをどのように変えれば、デバイス回転時にビューが一度回転して戻るような不自然な動作を回避することができるでしょう?

デバイス自体に回転ロック機能がありますが、横向き表示固定できる機能がないアプリは、横向き表示でデバイスの回転ロックを使うと強制的に縦向き表示にされてしまいます。横向き表示で回転ロックできるアプリをつくりたいと思っています。

よろしくお願いいたします。