NGUI 实现UIInput按字节长度限制输入

UIInput按字节长度限制输入

(汉字算2个字节,数字字母算1个字节)

如果需要限制20个汉字,就需要在页面上配置限制40个字符了。

而数字、字母等都是1个算一个字节,而汉字等算2个字节。

 

  • 方法一:在UIInput中进行修改
    ①增加下面的方法
protected int GetStringByteLength(string str)
    {
        byte[] bytestr = System.Text.Encoding.Default.GetBytes(str);
        return bytestr.Length;
    }

 ②修改下面的方法

public string Validate(string val) 
    { 
        if (string.IsNullOrEmpty(val)) return ""; 

        StringBuilder sb = new StringBuilder(val.Length); 

        for (int i = 0; i  0 && this.GetStringByteLength(val) >= characterLimit) 
        { 
            do 
            { 
                val = val.Substring(0, val.Length - 1); 
            } while (this.GetStringByteLength(val) > characterLimit); 
        } 
        return val; 
    } 

③修改下面的方法

protected virtual void Insert(string text)
    {
        string left = GetLeftText();
        string right = GetRightText();
        int rl = right.Length;

        StringBuilder sb = new StringBuilder(left.Length + right.Length + text.Length);
        sb.Append(left);

        // Append the new text
        for (int i = 0, imax = text.Length; i < imax; ++i)
        {
            // Can't go past the character limit
            if (characterLimit > 0 && this.GetStringByteLength(sb.ToString()) + 

this.GetStringByteLength(right) >= characterLimit) break;

            // If we have an input validator, validate the input first
            char c = text[i];
            if (onValidate != null) c = onValidate(sb.ToString(), sb.Length, c);
            else if (validation != Validation.None) c = Validate(sb.ToString(), sb.Length, c);

            // Append the character if it hasn't been invalidated
            if (c != 0) sb.Append(c);
        }

        // Advance the selection
        mSelectionStart = sb.Length;
        mSelectionEnd = mSelectionStart;

        // Append the text that follows it, ensuring that it's also validated after the inserted value
        for (int i = 0, imax = right.Length; i < imax; ++i)
        {
            char c = right[i];
            if (onValidate != null) c = onValidate(sb.ToString(), sb.Length, c);
            else if (validation != Validation.None) c = Validate(sb.ToString(), sb.Length, c);
            if (c != 0) sb.Append(c);
        }

        mValue = sb.ToString();
        UpdateLabel();
        ExecuteOnChange();
    }

 

  • 方法二:在上层逻辑中实现(推荐此方法)

 

    //下面的事件监听放入合适的方法中 调用
    EventDelegate.Add(this.mInput.onChange, this.OnInputChange);

    private void OnInputChange()
    {
        string str = this.mInput.value;
        if (characterLimit > 0 && this.GetStringByteLength(str) > characterLimit)
        {
            do
            {
                str = str.Substring(0, str.Length - 1);
            } while (this.GetStringByteLength(str) > characterLimit);
            this.mInput.value = str;
        }
    }
    private int GetStringByteLength(string str)
    {
        byte[] bytestr = System.Text.Encoding.Default.GetBytes(str);
        return bytestr.Length;
    }

 

你可能感兴趣的:(input)