首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >动画过程中iOS 7分割器图像中的UISegmentedControl错误

动画过程中iOS 7分割器图像中的UISegmentedControl错误
EN

Stack Overflow用户
提问于 2013-09-19 20:35:01
回答 5查看 4.1K关注 0票数 17

我有一个自定义的UISegmentedControl。在iOS 6和bellow中它工作得很好。在iOS 7下..它看起来很好,直到我按下控制,这时,分隔符图像看起来奇怪的一瞬间。

下面是我的代码:

代码语言:javascript
复制
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时,可能会导致分隔符显示错误,您知道会发生什么情况吗?谢谢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-08-13 01:32:55

我用类似于user2128193描述的方式解决了这个问题,但我没有为value changed事件添加目标,而是继承了UISegmentedControl并添加了以下两个方法:

代码语言:javascript
复制
- (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的内部结构,但至少它将使您的代码更干净一些。

票数 7
EN

Stack Overflow用户

发布于 2015-06-26 21:04:56

我通过重写子类中的touchesEnded并禁用CATransaction的动画解决了这个问题

代码语言:javascript
复制
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    CATransaction.setDisableActions(true)
    super.touchesEnded(touches, withEvent: event)
}
票数 2
EN

Stack Overflow用户

发布于 2013-09-26 08:59:58

我也遇到了类似的问题,我发现有两件事正在发生。其中一个是您已经处理过的(为突出显示的/选定的组合设置图像)。另一种是,当你选择一个新的线段时,UISegmentedControl会像UITableViewCells一样,在你选择它们时进行颜色高亮。而且,即使我已经定制了所有的艺术和文本,它仍然褪色到深色(我的文本甚至反转),然后它又回来了。在淡入淡出的过程中,我的分隔线的边缘很容易被看到。

我必须在模拟器中打开慢速动画才能更清楚地看到这一点。不幸的是,我还没能找到一种方法来禁用这些默认动画。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18894772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档