8

我有一个标题字符串为“DO:这些任务”的 UIActionSheet。在标题字符串中,子字符串“DO:”应为粗体(具有特定字体大小),子字符串“这些任务”应为常规。可能吗?我怎样才能做到这一点?

4

6 回答 6

30

我假设您有一个实现UIActionSheetDelegate协议的类,并且您的类是 current 的委托类UIActionSheet,因此在该类中您可以UIActionSheet更改like的整个标题

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    for (UIView *_currentView in actionSheet.subviews) {
        if ([_currentView isKindOfClass:[UILabel class]]) {
            [((UILabel *)_currentView) setFont:[UIFont boldSystemFontOfSize:15.f]];
        }
    }
}

但据您所知,您没有机会格式化UILabel对象text属性的一部分。


UILabel您可以使用不同的字体为您的now添加一个新actionsheet字体,如果您想查看带有粗体DO:字符串的文本...但是从这里开始,您的限制只是您的想象,您可以UIActionSheet在此方法中或在-didPresentActionSheet:方法也是。

所以这就是这个想法

2013 年 10 月 7 日更新

在 iOS7 中,我们并不能直接访问 UIAlertView 某个对象或 UIActionSheet 对象的子视图,因此该解决方案可能无法在 iOS7 环境中正常工作。

如果您在 iOS7 上遇到任何问题,请给我评论!谢谢你。

2014 年 6 月 22 日更新

我还没有找到任何解决方案可以直接使用UIAlertControlleriOS8 中的新功能来执行此操作,标题标签在 的整个视图层次结构中UIAlertController似乎不可见,在它出现之前甚至之后都不可见。

注意:我还发现,它出现在屏幕上之后,不禁止重叠/覆盖它的内容。目前无法预测它是否会在 Beta 版上运行,或者它是否是 AppStore 安全的。

注意:请牢记视图生命周期的时间表,如果导航堆栈中尚未显示任何内容,请不要尝试在视图或视图控制器中呈现任何内容。

无论如何,这是一个Swift解决方案,我可以如何到达这些层,并且可以向其中添加我的自定义视图。

let alertController: UIAlertController = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert)
self.presentViewController(alertController, animated: true, completion: {
    let aboveBlurLayer: UIView = alertController.view.subviews[0] as UIView
    let belowBlurLayer: UIView = (aboveBlurLayer.subviews[0].subviews as Array<AnyObject>)[0] as UIView
    let customView: UIView = UIView(frame: aboveBlurLayer.bounds)
    customView.backgroundColor = UIColor.redColor()
    aboveBlurLayer.addSubview(customView)
    })

注意:将自定义内容添加到警报/操作表可能很有用,但如果将来它不起作用,我会更新我的答案。

于 2012-07-24T10:57:40.990 回答
10

对于 iOS 7,以下代码将起作用。

实现UIActionSheetDelegate如下

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    [actionSheet.subviews enumerateObjectsUsingBlock:^(id _currentView, NSUInteger idx, BOOL *stop) {
        if ([_currentView isKindOfClass:[UIButton class]]) {
            [((UIButton *)_currentView).titleLabel setFont:[UIFont boldSystemFontOfSize:15.f]];
            // OR
            //[((UIButton *)_currentView).titleLabel setFont:[UIFont fontWithName:@"Exo2-SemiBold" size:17]];
        }
    }];
}

对于 iOS 6

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    for (UIView *_currentView in actionSheet.subviews) {
        if ([_currentView isKindOfClass:[UILabel class]]) {
            [(UILabel *)_currentView setFont:[UIFont boldSystemFontOfSize:15.f]];
            // OR
            //[(UILabel *)_currentView setFont:[UIFont fontWithName:@"Exo2-SemiBold" size:17]];
        }
    }
}
于 2014-01-07T10:50:19.123 回答
6

根据 Holex 的回答:

对于 iOS7 和 iOS6,以下内容对我来说可以更改 UIActionSheet 属性的标题。请注意,我实际上是在添加一个新的子视图,因为未知?为什么更新当前的 UILabel 只给出垂直一半的文本?同样“title”显然是第一个 UILabel,所以我们在一次更改后打破循环。

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    for (UIView *_currentView in actionSheet.subviews) {
        if ([_currentView isKindOfClass:[UILabel class]]) {
            UILabel *l = [[UILabel alloc] initWithFrame:_currentView.frame];
            l.text = [(UILabel *)_currentView text];
            [l setFont:[UIFont fontWithName:@"Arial-BoldMT" size:20]];
            l.textColor = [UIColor darkGrayColor];
            l.backgroundColor = [UIColor clearColor];
            [l sizeToFit];
            [l setCenter:CGPointMake(actionSheet.center.x, 25)];
            [l setFrame:CGRectIntegral(l.frame)];
            [actionSheet addSubview:l];
            _currentView.hidden = YES;
            break;
        }
    }
}

以上似乎适用于 iOS6 和 iOS7 模拟器。我不确定这是否适用于其他未来版本的 iOS。

于 2013-10-24T08:45:29.260 回答
4

以下可能有用。

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
    [actionSheet.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:[UIButton class]]) {
            UIButton *button = (UIButton *)obj;
            button.titleLabel.font = [UIFont systemFontOfSize:15];
        }
    }];

}
于 2013-12-19T07:07:40.167 回答
0

看到这些链接。并使用它。 属性标签

http://www.cocoacontrols.com/platforms/ios/controls/ohattributedlabel

于 2012-07-24T10:58:48.683 回答
0

有一个UIActionSheet被调用的内部属性,_titleLabel因此可以获取引用并直接更改此标签的属性字符串属性。

请注意,这是一个私有 API,可能会在 App Store 中被拒绝。

下面是它的工作原理:

- (NSAttributedString *) actionSheetAttributedTitle;
{
    NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:@"Test"];
    UIFont *font=[UIFont fontWithName:@"Helvetica-Bold" size:13.0f];
    [attString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, attString.length)];
    [attString addAttribute:NSForegroundColorAttributeName
                  value:[UIColor blackColor]
                  range:NSMakeRange(0, attString.length)];
    return [attString copy];
}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet;
{
    UILabel *sheetTitleLabel;
    if([actionSheet respondsToSelector:@selector(_titleLabel)]) {
        sheetTitleLabel = objc_msgSend(actionSheet, @selector(_titleLabel));
        sheetTitleLabel.attributedText = [self actionSheetAttributedTitle];

    }
}
于 2014-06-23T18:08:56.980 回答