Well, one big concern is on what thread you started locationManager. It calls its delegate methods on that same thread. Now you probably started it on the main thread but I don’t know that from looking at this code. And of course, you would not want to be transforming a UIView on anything but the main thread (main queue, technically).
Another concern is I’d separate the rotation code from the locationManager code. You want to be able to test them independently, and there are possibly times when you may want to force the heading to a particular value.
Another thought is performance. How many times a second can the heading delegate be called? If sometimes more than 10, you should skip those - the human eye won’t discern more motion than that. In fact for this purpose I’d cap it at 1s.
You should also consider checking the headingAccuracy. Do you want to accept and display even the most inaccurate “guesses” of heading?
As for rotating the view, you may run into layout constraint issues if autolayout matters to you for this view. See this SO for details. I do wonder if you can rotate a layer of your view instead.
Another thing to worry about is how your view behaves during and after device orientation changes. This SO code, if changed for your goals, would be useful if device orientation proves to be a problem.
All in all, I’d choose changing the view’s image (by drawing into the view) or layer over rotating the entire view, to avoid some of the above concerns. I bet it would be more performant too.