代码之家  ›  专栏  ›  技术社区  ›  SaltyNuts

UITextField属性占位符无效

  •  14
  • SaltyNuts  · 技术社区  · 12 年前

    我正在尝试将文本字段中的占位符设置为斜体,由于我的应用程序针对的是iOS 6.0或更新版本,因此决定使用 attributedPlaceholder 属性,而不是滚动更自定义的内容。代码如下:

    NSString *plString = @"optional";
    NSAttributedString *placeholder = [[NSAttributedString alloc] initWithString:plString
            attributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:15]}];
    for (UITextField *t in myTextfields){
        t.placeholder = plString;
        t.attributedPlaceholder = placeholder;
    }
    

    然而,占位符的样式仍然不是斜体,而是与常规文本相同,只是变暗了。我错过了什么来制作 NSAttributedString 工作

    4 回复  |  直到 12 年前
        1
  •  18
  •   Mike    11 年前

    正如沃伦所指出的,目前的造型还不能像你尝试的那样完成。一个很好的解决方法是按照占位符的外观设置文本字段的字体属性,然后在用户开始键入时更改文本字段的颜色。看起来占位符和文本是不同的字体。

    您可以通过创建文本字段的委托并像这样使用shouldChangeCharactersinRange来实现这一点:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {    
        // If there is text in the text field
        if (textField.text.length + (string.length - range.length) > 0) {
            // Set textfield font
            textField.font = [UIFont fontWithName:@"Font" size:14];
        } else {
            // Set textfield placeholder font (or so it appears)
            textField.font = [UIFont fontWithName:@"PlaceholderFont" size:14];
        }
    
        return YES;
    }
    
        2
  •  10
  •   warrenm    12 年前

    这几乎可以肯定是一个bug。这个 documentation for the attributedPlaceholder property 声称无论前景色属性如何,字符串都将使用灰色绘制,但事实并非如此:您可以设置前景色和背景色。不幸的是,字体属性似乎被剥离并恢复为系统字体。

    作为一种变通方法,我建议重写 drawPlaceholderInRect: 并自己绘制占位符。此外,您应该为此提交一份Radar文件,并包括一个演示该错误的最小样本项目。

        3
  •  8
  •   XCool    11 年前

    我自己刚刚偶然发现了这个问题。显然,占位符将采用文本字段所分配的任何字体。只需设置文本字段的字体,就可以了。

    对于其他一切,比如占位符的颜色,我仍然会回到 attributedPlaceholder

        4
  •  -1
  •   brian.clear    9 年前

    iOS8/9/Swift 2.0-工作示例

    func colorPlaceholderText(){
        var multipleAttributes = [String : NSObject]()
        multipleAttributes[NSForegroundColorAttributeName] = UIColor.appColorCYAN()
        //OK - comment in if you want background color
        //multipleAttributes[NSBackgroundColorAttributeName] = UIColor.yellowColor()
        //OK - Adds underline
        //multipleAttributes[NSUnderlineStyleAttributeName] = NSUnderlineStyle.StyleDouble.rawValue
    
    
        let titleString = "Search port/country/vessel..."
        let titleAttributedString = NSAttributedString(string: titleString,
            attributes: multipleAttributes)
    
    
        self.textFieldAddSearch.attributedPlaceholder = titleAttributedString
    }