Проблема в том, что (нетрансформированный) UISlider
игнорирует запрашиваемую вами высоту кадра и использует высоту кадра 23. Например, я сделал это:
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(80, 100, 40, 10)];
[self.view addSubview:slider];
и вот результирующий кадр:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x6c1c9a0; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x6c1ca30>>
| <UIView: 0x6c23160; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x6c22750>>
| | <UISlider: 0x6c22ad0; frame = (80 100; 40 23); opaque = NO; layer = <CALayer: 0x6c21ae0>; value: 0.000000>
и его центральная точка:
(gdb) p (CGPoint)[0x6c22ad0 center]
$1 = {
x = 100,
y = 111.5
}
Обратите внимание на то, что его центр находится в координате полу-точки на оси Y. Если вы поворачиваете ползунок на правильный угол, как это:
slider.transform = CGAffineTransformMakeRotation(M_PI * 1.5);
его центр не меняется, но его рамка меняется:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x6a3a000; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x6a36780>>
| <UIView: 0x6a3c420; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x6a3ba10>>
| | <UISlider: 0x6a3bd90; frame = (88.5 91.5; 23 40); transform = [0, -1, 1, 0, 0, 0]; opaque = NO; layer = <CALayer: 0x6a3be20>; value: 0.000000>
...
(gdb) p (CGPoint)[0x6a3bd90 center]
$1 = {
x = 100,
y = 111.5
}
Таким образом, после поворота на прямой угол вам необходимо отрегулировать центральную точку на пол-точки по осям X и Y:
CGPoint center = slider.center;
center.x += .5;
center.y += .5;
slider.center = center;
так, чтобы рамка лежала на целых границах точек:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x9960aa0; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x9962970>>
| <UIView: 0x9964680; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x9963c70>>
| | <UISlider: 0x9964020; frame = (89 92; 23 40); transform = [0, -1, 1, 0, 0, 0]; opaque = NO; layer = <CALayer: 0x9963010>; value: 0.000000>