iOS 7.1包含一个新的“辅助功能”设置,调用“按钮形状”会导致某些按钮文本自动加下划线。有没有办法检测此模式,或为个别UIButton
定制?
(这允许更改按钮标签,例如破折号或下划线,以便在加下划线时,它们看起来不像等号等。)
答案 0 :(得分:3)
从iOS 14开始,您可以使用UIAccessibility.buttonShapesEnabled
或UIAccessibilityButtonShapesEnabled()
,当启用该设置时,这将是正确的。
答案 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呈现为图像:
然后检查&#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