Eventuell könnte es daran liegen, dass visible zu Beginn nicht false, sondern nil ist. Für die Auswertung von if Statements zählt nil genau so wie false. Darum kann man auch if @background_panorama.visible abfragen und es hat den selben effekt wenn es nil oder false ist. Ein Vergleich nil == false führt allerdings zu false, da nil sich für Bedingungen zwar verhält wie false, aber natürlich trotzdem ein anderer Wert ist. Für so einen Schaltermechanismus könntest du doch auch einfach @background_panorama.visible = !@background_panorama.visible verwenden.