2016-07-16 16 views
1

UILabelUISliderの親指に入れたいと思います。UISlider ViewDidLoad()のサブビューがありません

私のコードは、これに基づいている:Another SO question

問題は、あなたが値を変更する前に、そのコードで、親指にはテキストがありませんということです。だから私はいくつかの変更を加えました。ラベルをグローバル変数にして、viewDidLoad()に設定しました。次に、スライダが値を変更するときにテキストを変更するだけです。

let thumbView = mySlider.subviews.last 
label.frame = (thumbView?.bounds)! 
mySlider

subviews配列が空である:

実際の問題は、この(viewDidLoad()のコード)です。したがって、ゼロ値をアンラップするのでクラッシュが発生します。

ビューが完全に初期化されているため、なぜそれが起こるのかわかりません。

なぜmySlider.subviewsが空ですか?私は何が欠けていますか?誰も私はこれを修正する方法を知っていますか?親指の真ん中にラベルを置く他の方法はありますか?

+0

あなたのビューが完全に初期化が、あなたのスライダーのサブビューは限りません。 thumbViewは遅れてインスタンス化される可能性が高いので、まだ呼び出されていないため、 'viewDidLoad'で作成されていません。スライダのビュー階層を直接操作する必要がないようにするには、@ Zac Kwanの提案を使用する必要があります。 – beyowulf

+0

@beyowulf強制的に初期化する方法はありますか? –

答えて

2

mySlider.subviews.lastは、thumbImageの中心を取得する信頼できる方法ではありません。それはドキュメントのどこにも言及されていませんでした。私は個人的にそれをそうするためにかなりハッキーだと思う。しかし

、あなたがtrackRectForBoundsthumbRectForBoundsの組み合わせを使用してslidervalueにベースを計算することができsliderの中心を取得します。

これはあなたのために働く必要があります。

@IBAction func sliderValueChanged(slider: UISlider) { 
    let trackRect = slider.trackRectForBounds(slider.bounds) 
    let thumbRect = slider.thumbRectForBounds(slider.bounds, trackRect: trackRect, value: slider.value) 

    sliderLabel.center = CGPointMake(thumbRect.origin.x + thumbRect.size.width/2 + slider.frame.origin.x, slider.frame.origin.y + thumbRect.size.height/2) 
} 

は、基本的にこれが何を最初thumbRectを計算するためにそれを使用し、その後、トラックの矩形を計算することです。最後に、スライダの幅と高さ、親指のサイズを考慮して中心を設定します。

labelテキストの配置を中央に設定することを忘れないでください。

+0

それは意味をなさないが動作しません。あなたのコードは、初期値として 'viewDidLoad()'に、値が変更されたときには関数に入れます。問題は次のとおりです。1.ラベルは親指の少し上です。 2.値を変更すると、ラベルは移動しません。 – Lawrence413

+0

私はそれをちょっと試してみましたが、私はラベルを親指にとどめていました(前にスライダーをステップ/スナップで値段に変更しました)が、まだ親指よりも高く、本当に変です。私は親指が160x30ptsに変更され、ラベルがスライダのxの原点に残る別のスライダを持っています。 – Lawrence413

+0

これは、OPの質問を解決するために何もしません。それは、センターを別のハッキングで取得するためのハックを置き換えることだけです。スライダーが 'viewDidLoad()'メソッドにロードされた後でも、ラベルは表示されません。これはOP(と私)が探しているものです。 –

0

your linked questionのコードはうまく動作し、変更する必要はありません。

は、このメソッドを追加し、初期値は、あなたの UISliderUILabelとして表示されます。

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 

    [mySlider sendActionsForControlEvents:UIControlEventValueChanged]; 
} 
関連する問題