2013-09-24 27 views
21

Tôi có một lớp con UITextField nơi tôi đang thực hiện phương thức dưới đây:UITextField không cuộn đến cuối sau khi triển khai textRectForBounds và editingRectForBounds trong một lớp con?

- (CGRect)textRectForBounds:(CGRect)bounds { 

    return CGRectInset(bounds , 30, 7); 
} 

-(CGRect) editingRectForBounds:(CGRect)bounds { 
    return CGRectInset(bounds , 30, 7); 
} 

Do hai phương pháp này, các UITextField không di chuyển đến cùng khi văn bản đã nhập được lớn hơn chiều rộng của UITextField. Có giải pháp nào cho điều này không?

+0

Bạn đang thực hiện những để tạo ra một hình chữ nhật xung quanh văn bản? Có nhiều cách khác để đạt được điều đó, có lẽ ít lỗi hơn. –

+0

Bạn có chắc chắn bạn không ghi đè điều gì khác không? Bởi vì tôi đã thực hiện một dự án thử nghiệm đơn giản với một văn bản tùy chỉnh, chỉ cần ghi đè bằng 2 phương thức ở trên và văn bản sẽ cuộn theo chiều ngang đến cuối. – florian

+0

Làm việc của nó phù hợp nếu bạn đặt trường văn bản của bạn trực tiếp trong xib, bởi vì adjustsFontSizeToFitWidth tùy chọn đã được thiết lập "CÓ". nhưng nếu bạn phân bổ động của lớp textfield, bạn cần phải đặt textFieldObject.adjustsFontSizeToFitWidth = YES; – Yogendra

Trả lời

4

Đây có thể là xung đột giữa chiều cao UITextFieldCALayer tùy chỉnh của bạn với insets và kích thước phông chữ.

Bạn có thể thử một trong những Điều chỉnh:

  • Giảm cỡ chữ;
  • Tăng chiều cao UITextField trên Storyboard hoặc theo trình tự trong lớp con của bạn như:

    - (void)drawRect:(CGRect)rect { 
        CGRect frameRect = self.frame; 
        frameRect.size.height = 35 //specify the height you want; 
        self.frame = frameRect; 
    } 
    
  • Giảm y-giá trị toạ độ trên CGRectInset;

  • Hoặc sử dụng UIEdgeInsets để có nhiều quyền kiểm soát hơn trong việc đặt giá trị của từng vị trí. Một cái gì đó như:

    - (CGRect)textRectForBounds:(CGRect)bounds{ 
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30); 
        return UIEdgeInsetsInsetRect(bounds, contentInsets); 
    } 
    
    - (CGRect)editingRectForBounds:(CGRect)bounds{ 
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30); 
        return UIEdgeInsetsInsetRect(bounds, contentInsets); 
    } 
    
2

Reason - Bạn đang sử dụng cỡ chữ cố định cho văn bản textfield. Sử dụng số điện thoại này

textFieldObject.adjustsFontSizeToFitWidth = YES; 

Ngắn và đơn giản. Nếu bạn muốn thiết lập kích thước phông chữ tối thiểu của bạn, bạn có thể sử dụng

textFieldObject.minimumFontSize 

Thưởng thức

0

Tôi không chắc chắn đây là những gì bạn đang tìm kiếm, nhưng việc sửa đổi editingRectForBounds theo cách sau, sẽ làm cho hình chữ nhật năng động, do đó, một khi hộp văn bản có được "đầy đủ", nó sẽ làm giảm inset để các văn bản sẽ điền vào toàn bộ hộp văn bản.

giả textInset_ là inset truy nã:

- (CGRect)editingRectForBounds:(CGRect)bounds { 
    CGFloat compensate = .0f; 
    CGSize size = [self.text sizeWithFont:self.font]; 
    CGFloat textboxWidth = CGRectGetWidth(self.width); 

    // If size of text plus inset (right side) is bigger 
    // than textbox's width, don't set an inset 
    if (size.width+textInset_ >= textboxWidth) { 
     compensate = 0; 
    } 

    // If text area (textbox width minus two insets) is less than 
    // text size, lessen the inset so the text fits in 
    else if (textboxWidth - textInset_*2 < size.width) { 
     compensate = fabs(size.width - (textboxWidth - textInset_)); 
    } 

    // Text fits in textbox WITH insets 
    else { 
     compensate = textInset_; 
    } 
    return CGRectInset(bounds, compensate, 10); 
} 
10

nó không làm việc chỉ vì kích thước phông chữ của văn bản bạn đã khai báo trong UITextFieldCGRectInset bạn đang áp dụng. Trên thực tế nó phải là theo kích thước font bạn đang thiết lập. Ví dụ: đối với kích thước phông chữ là 14,0, chỉ cần thay đổi phương thức của bạn như sau:

- (CGRect)textRectForBounds:(CGRect)bounds { 
    return CGRectInset(bounds , 30, 6); 
} 
-(CGRect) editingRectForBounds:(CGRect)bounds { 
    return CGRectInset(bounds , 30, 6); 
} 

Lý do là hình chữ nhật vẽ của văn bản. Ví dụ: khi chúng tôi đặt kích thước phông chữ là UITextField là 14.0 thì yêu cầu phải có độ cao tối thiểu là 18.0 để điều chỉnh văn bản trong khung. Vì vậy, nó cần thêm 4 pixel xung quanh văn bản, bạn có thể nói nó là khung lớp phủ. Do đó, trong trường hợp của bạn, điều kiện này không thỏa mãn vì tôi đoán bạn đã điều chỉnh kích thước phông chữ thành 14.0 và theo chiều cao khung mặc định là UITextField là 30.0 và mặt nạ cạnh của bạn là 7.0 mỗi bên có nghĩa là tổng số 14.0 . Vì vậy, rect của bạn cho văn bản trả về 16.0 mà lần lượt chặn hệ điều hành từ việc cập nhật khung văn bản vì nó nằm ngoài ngữ cảnh đồ họa.Tôi hy vọng bạn rõ ràng. Nếu nó giải quyết được vấn đề của bạn thì vui lòng chấp nhận câu trả lời của tôi. Câu trả lời hay hơn sẽ như sau:

- (CGRect)textRectForBounds:(CGRect)bounds { 
return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2); 
} 

-(CGRect) editingRectForBounds:(CGRect)bounds { 
    return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2); 
} 

Tận hưởng!

+1

Một vấn đề tôi thấy ở đây là câu trả lời này xem xét '- [UIFont pointSize]' hoán đổi cho nhau với khoảng cách pixel. – Sulthan

+0

Đó không phải là lý do để bạn bỏ phiếu. Kiểm tra câu trả lời rồi bỏ phiếu xuống. Kích thước phông chữ được xem là tính toán mặt nạ cạnh tối đa cho UITextField cho một kích thước phông chữ cụ thể. Và theo như tôi biết kích thước phông chữ để chuyển đổi pixel là hoàn toàn phụ thuộc vào iOS cho dù đó là võng mạc/đồng bằng. –

+1

Xin vui lòng không sửa câu trả lời của tôi để làm cho nó vô nghĩa .. Các con số chính xác những gì tôi đã viết. –

0
step 1 - make a custom text field MyTextField first 

@interface MyTextField : UITextField 
step 2 - override MyTextField methods as per your requirement 

///place holder position 

- (CGRect)placeholderRectForBounds:(CGRect)bounds 
{ 
    return CGRectInset(bounds, 8, 8); 
} 
// text position 
- (CGRect)textRectForBounds:(CGRect)bounds { 

    return CGRectInset(bounds, 8,4); 
} 

// text position while editing 
- (CGRect)editingRectForBounds:(CGRect)bounds { 

    return CGRectInset(bounds, 8, 4); 
} 
step 3- import MyTextField in your controller class & make object of MyTextField 

#import "MyTextField.h" 

-(void) viewWillAppear:(BOOL)animated { 

    MyTextField* textfield1 = [[MyTextField alloc] init]; 
    // and so on 

} 

Với Liên quan đến liên kết này:

- (CGRect) textRectForBounds:(CGRect)bounds not being called

Các vấn đề liên quan