17

カスタム UISegmentedControl があります。iOS 6 以降では正常に動作します。iOS 7.. では、コントロールを押すまで問題ないように見えますが、コントロールを押すと、仕切りの画像が一瞬変に見えます。

これが私のコードです:

UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel.png"]
                                resizableImageWithCapInsets:UIEdgeInsetsMake(6, 6, 6, 6)];
    UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_unsel.png"]
                                  resizableImageWithCapInsets:UIEdgeInsetsMake(6, 6, 6, 6)];
    UIImage *segmentSelectedUnselected =
    [UIImage imageNamed:@"segcontrol_sel_uns.png"];
    UIImage *segUnselectedSelected =
    [UIImage imageNamed:@"segcontrol_uns_sel.png"];

    [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected
                                               forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setBackgroundImage:segmentSelected
                                               forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected
                                               forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected
                                 forLeftSegmentState:UIControlStateNormal // | UIControlStateHighlighted
                                   rightSegmentState:UIControlStateSelected
                                          barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected
                                 forLeftSegmentState:UIControlStateHighlighted
                                   rightSegmentState:UIControlStateSelected
                                          barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected
                                 forLeftSegmentState:UIControlStateSelected
                                   rightSegmentState:UIControlStateNormal //| UIControlStateHighlighted)
                                          barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected
                                 forLeftSegmentState:UIControlStateSelected
                                   rightSegmentState:UIControlStateHighlighted
                                          barMetrics:UIBarMetricsDefault];

    UIFont *font = [UIFont systemFontOfSize:16.0f];
    UIColor *textColor = [UIColor darkGrayColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                font, @"NSFontAttributeName",
                                textColor, @"NSForegroundColorAttributeName",
                                nil];

    [[UISegmentedControl appearance] setTitleTextAttributes:attributes
                                                   forState:UIControlStateNormal];

UISegmentedControl を押したときに何が起こっているのか、仕切りが間違って表示される可能性がありますか? ありがとう?

4

6 に答える 6

7

user2128193 の説明と同様の方法でこれを解決しましたが、値変更イベントのターゲットを追加する代わりに、UISegmentedControl をサブクラス化し、次の 2 つのメソッドを追加しました。

- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents
{
    [super sendActionsForControlEvents:controlEvents];

    if (controlEvents & UIControlEventValueChanged) {
        [self removeAnimationsRecursivelyForView:self];
    }
}

- (void)removeAnimationsRecursivelyForView:(UIView *)view
{
    [view.layer removeAllAnimations];

    for (UIView *subview in [view subviews]) {
        [self removeAnimationsRecursivelyForView:subview];
    }
}

UISegmentedControl の内部構造に依存するという点で、明らかにこれはまだ完全な解決策ではありませんが、少なくともコードを少しきれいに保つことができます。

于 2014-08-12T17:32:54.700 に答える
4

TL;DR 各セグメントのすべてのアニメーションを削除するだけです。以下のコードを参照してください

セグメントのレイヤーで removeAllAnimations を呼び出し、各セグメント内にネストされた UILabel で removeAllAnimations を呼び出して、backgroundImage とタイトル (UILabel) のデフォルトのアニメーションを削除することで、この問題を修正できました。このコードは、UISegmentedControl の valueChanged イベントが発生したときに呼び出される IBAction メソッド内に配置しました。

- (IBAction)tabSelected:(id)sender
{
    UISegmentedControl *segmentedControl = (UISegmentedControl *)sender;

    for (UIView *segment in [segmentedControl subviews]) {
        [segment.layer removeAllAnimations];

        for (UIView *view in [segment subviews]) {
            if ([view isKindOfClass:[UILabel class]]) {
                [view.layer removeAllAnimations];
            }
        }
    }
}

UIImage であるコンテンツでこれをテストしていませんが、この行を変更する限り機能しない理由はわかりません。

[view isKindOfClass:[UILabel class]

次のように UIImage クラスに一致させます。

[view isKindOfClass:[UIImage class]
于 2013-12-18T09:53:29.653 に答える
2

touchesEndedサブクラスでオーバーライドし、CATransaction のアニメーションを無効にすることでこれを解決しました

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    CATransaction.setDisableActions(true)
    super.touchesEnded(touches, withEvent: event)
}
于 2015-06-26T13:04:56.220 に答える