A
UISlider
is an analog version of two digital
control
objects,
the
UIPageControl
and
UIStepper.
With a
print("slider.frame = \(slider.frame)");
I discovered that the slider’s
height is 34 pairs of pixels in iPhone 6, iOS 8.1.
But this fact is nowhere in Apple’s documentation,
so it might change without warning in a future release.
I set the slider’s width to 80% of the
View’s
width.
Thanks to the
UIViewAutoresizing.FlexibleWidth,
the slider’s width will remain 80% of the
View’s
width,
even in landscape orientation.
AppDelegate.swift:
unchanged.ViewController:
unchanged.View:
added the methods
init
and
valueChanged.
continuous
propery of the slider to
false?
init
method of class
View,
specify the label’s font size as
UIFont.labelFontSize()
instead of as
26.
valueChanged
method of class
View.
let margin: CGFloat = frame.size.height / 30; //Range is the height (in pairs of pixels) of the range //over which the position of the cener of the label will vary. let range: CGFloat = (frame.size.height - label.frame.size.height) / 2 - 2 * margin; //The fraction is in the range 0 to 1 inclusive. //Convert Float to CGFloat. let fraction: CGFloat = CGFloat((slider.value - slider.minimumValue) / (slider.maximumValue - slider.minimumValue)) label.center = CGPointMake( bounds.origin.x + frame.size.width / 2, bounds.origin.y + frame.size.height / 2 + slider.frame.size.height / 2 + margin + range * fraction);The initial position of the label should be halfway down the lower half of the
View.
And instead of creating
margin
in two different methods of class
View,
we should create it once and for all as a propery of the class.
initView.
We saw the
affine
transformations
in
Japan.
Multiplication by
π/180
converts degrees to radians.
(We see a vertical slider on a Macintosh
when we select the volume control in the Mac status bar.)
//Convert 90 degrees to radians. Negative is counterclockwise. //M_PI is Double, so we have to convert it explicitly to CGFloat. let radians: CGFloat = CGFloat(-90 * M_PI / 180); slider.transform = CGAffineTransformMakeRotation(radians);The label will have to be repositioned. Here’s an initial attempt you can start with.
//in layoutSubviews method of class View label.frame = CGRectMake( center.x - slider.frame.size.height / 2, center.y + slider.frame.size.height / 2 + margin, slider.frame.size.height, slider.frame.size.width);