如何检查Button Shapes设置是否已启用?

时间:2014-03-11 19:16:26

标签: ios7 accessibility

iOS 7.1包含一个新的“辅助功能”设置,调用“按钮形状”会导致某些按钮文本自动加下划线。有没有办法检测此模式,或为个别UIButton定制?

(这允许更改按钮标签,例如破折号或下划线,以便在加下划线时,它们看起来不像等号等。)

7 个答案:

答案 0 :(得分:3)

从iOS 14开始,您可以使用UIAccessibility.buttonShapesEnabledUIAccessibilityButtonShapesEnabled(),当启用该设置时,这将是正确的。

答案 1 :(得分:1)

看起来您可以请求按钮标签的属性并测试它是否包含NSUnderlineStyleAttributeName属性。如果你删除NSUnderlineStyleAttributeName属性,系统会把它放回去,所以看起来诀窍就是明确地将标签的下划线属性设置为0.我已将以下内容添加到我的自定义按钮:

- (void) adjustLabelProperties  // override underline attribute
{
    NSMutableAttributedString   *attributedText = [self.titleLabel.attributedText mutableCopy];

    [attributedText addAttribute: NSUnderlineStyleAttributeName value: @(0) range: NSMakeRange(0, [attributedText length])];
    self.titleLabel.attributedText = attributedText;
}

答案 2 :(得分:1)

我知道这是一个老问题,但这段代码有效。在iOS 9.3中测试

NSMutableAttributedString *attrStr = [btn.titleLabel.attributedText mutableCopy];
[attrStr enumerateAttributesInRange:NSMakeRange(0, [attrStr length])
                            options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
                         usingBlock:^(NSDictionary *attributes, NSRange range, BOOL *stop) {
                             NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
                             if([mutableAttributes objectForKey:NSUnderlineStyleAttributeName] != nil) {
                                 //It's enabled for this button
                             }
                         }];

禁用特定按钮的按钮形状

[btn.titleLabel.attributedText addAttribute: NSUnderlineStyleAttributeName value: @(0) range: NSMakeRange(0, [attributedText length])];

答案 3 :(得分:1)

老问题,但希望这有助于某人。仍然没有内置的方法来检查iOS上是否启用了Button Shapes,所以我们添加了这个:

#pragma mark - Accessibility

/**
 * There's currently no built-in way to ascertain whether button shapes is enabled.
 * But we want to manually add shapes to certain buttons when it is.
 */

static BOOL _accessibilityButtonShapesEnabled = NO;

+ (BOOL)accessibilityButtonShapesEnabled {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self checkIfButtonShapesEnabled];
    });

    return _accessibilityButtonShapesEnabled;
}

+ (void)checkIfButtonShapesEnabled {
    UIButton *testButton = [[UIButton alloc] init];
    [testButton setTitle:@"Button Shapes" forState:UIControlStateNormal];

    _accessibilityButtonShapesEnabled = (BOOL)[(NSDictionary *)[testButton.titleLabel.attributedText attributesAtIndex:0 effectiveRange:nil] valueForKey:NSUnderlineStyleAttributeName];
}

因为在应用程序运行时禁用/启用按钮形状时也没有通知,我们在checkIfButtonShapesEnabled中运行applicationDidBecomeActive:,如果值已更改,则推送我们自己的通知。这应该适用于所有情况,因为目前无法将“按钮形状”切换添加到“辅助功能快捷方式”。

答案 4 :(得分:0)

我遇到了同样的问题,但我没有找到正式的解决方案。因此,在Apple发布解决方案之前,我发现的唯一解决方法是将UIToolbar呈现为图像并检查按钮是否加下划线:

+ (BOOL)isUsesButtonShapes {
    BOOL result = FALSE;

    CGRect rect = CGRectMake(0, 0, 320, 44);
    CGPoint point = CGPointMake(26, 33);

    UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:rect] autorelease];
    toolbar.backgroundColor = [UIColor whiteColor];
    toolbar.tintColor = [UIColor darkGrayColor];
    toolbar.barTintColor = [UIColor whiteColor];
    [toolbar setItems:@[[[[UIBarButtonItem alloc] initWithTitle:@"Test" style:UIBarButtonItemStyleBordered target:nil action:nil] autorelease]]];
    toolbar.barStyle = UIBarStyleDefault;
    toolbar.translucent = FALSE;

    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    [toolbar.layer renderInContext:context];

    int bpr = CGBitmapContextGetBytesPerRow(context);
    unsigned char *data = CGBitmapContextGetData(context);
    if (data != NULL) {
        int offset = (int) (bpr * point.y + 4 * point.x);
        int blue = data[offset + 0];

        result = blue < 250;
    }

    UIGraphicsEndImageContext();

    return result;
}

它基本上只是将UIToolbar呈现为图像:

Rendered UIToolbar

然后检查&#34; T&#34;下的像素中是否有下划线。我知道如果Apple改变了UIToolbar的渲染方式,这很容易就会破裂。但也许这种方法可以改进,至少比什么都好?对不起,这不是一个好的解决方案,但我还没有找到更好的方法。

答案 5 :(得分:0)

这只是半相关的,但我有点自己的&#34;对于Button形状,并通过设置菜单为用户提供选项。

我为没有&#34;发现&#34;而道歉。关于这个问题,但这是我最后想到的同样的问题。

(该示例设置为始终使用半圆形圆角,无论大小如何 - 请根据需要进行修改。)

-(void)setBorderForButton:(UIButton*)theButton withSetting:(BOOL)theSetting{
    if (theSetting == YES){
        theButton.layer.cornerRadius = theButton.frame.size.height/2;
        theButton.layer.borderWidth = 1;
        theButton.layer.borderColor = [UIColor yourDesiredColor].CGColor;
        theButton.clipsToBounds = YES;
    }
}

答案 6 :(得分:0)

我将代码从this转换为Swift(4.2):

import UIKit

public extension UIAccessibility {

    public static var isButtonShapesEnabled: Bool {
        let button = UIButton()
        button.setTitle("Button Shapes", for: .normal)
        return button.titleLabel?.attributedText?.attribute(NSAttributedString.Key.underlineStyle, at: 0, effectiveRange: nil) != nil
    }

}

用法:

if UIAccessibility.isButtonShapesEnabled {
    // Apply button shapes style to custom button...
}

经过测试并在iOS 12中正常工作。

最初由我自己提问:Click