如何检查是否启用的按钮形状设置?

问题描述 投票:13回答:6

的iOS 7.1包括一个新的辅助功能的设置要求,导致一些按钮上的文字被自动加下划线的按​​钮形状。有没有一种方法来检测这种模式下,或自定义为个人UIButtons?

(这允许改变按钮标签,如破折号或下划线,以便强调时候,他们不看像一个等号,等等)

ios7 accessibility
6个回答
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;
}

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])];

1
投票

老问题,但希望这可以帮助别人。目前仍然因为如果按钮形状是iOS上启用检查没有内置的方法,所以我们增加了这一点:

#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:,如果该值已更改推动我们自己的通知。这应该适用于所有情况,因为它是目前不可能按钮形状切换添加到“无障碍快捷方式”。


0
投票

我有同样的问题,我没有发现官方的解决方案。所以,我发现,直到苹果公司唯一的解决方法释放一个解决方案是使一个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成图像:

然后它检查是否有在下的“T”的像素中的下划线。我知道,这很容易断裂,如果苹果改变了UIToolbar是如何呈现的方式。但是,也许这种方法可以改善,至少比没有好?对不起,这不是一个很好的解决方案,但我没有找到更好的东西呢。


0
投票

这仅仅是半有关,但我有种“推出自己的”为按钮的形状,使选项可通过设置菜单的用户。

我不被“当场就”关于这个问题深表歉意,但是这是我结束了与思考同样的问题。

(这个例子被设置为始终使用一个半圆的圆角无论大小 - 请修改为你想)。

-(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;
    }
}

0
投票

我转换的代码从this交到夫特(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

© www.soinside.com 2019 - 2024. All rights reserved.