2015-08-06 18 views
12

Tôi muốn xây dựng thành phần gốc phản ứng iOS - tương tự của Văn bản, nơi chiều rộng và chiều cao không được biết, nhưng được tính động tùy thuộc vào nội dung của nó. Như tôi thấy từ gỡ lỗi, phương pháp RCTText.drawRect được gọi là với tính toán rect đã có, nhưng thành phần của tôi được gọi là với rect trống nếu tôi không xác định kích thước thông qua phong cách.Thành phần giao diện người dùng có kích thước động nguyên bản cho React Native

Cách xác định nội dung cần thiết cho Chế độ xem tùy chỉnh?

Trả lời

2

Câu trả lời nằm trong khái niệm chế độ xem 'bóng'. Dường như không được ghi lại, nhưng React Native sử dụng chế độ xem 'bóng' để tính toán bố cục trước khi hiển thị thực tế. lớp Vì vậy RCTShadowText được sử dụng để bố trí các thẻ và chức năng của nó RCTMeasure:

static css_dim_t RCTMeasure(void *context, float width) 
{ 
    RCTShadowText *shadowText = (__bridge RCTShadowText *)context; 
    NSTextStorage *textStorage = [shadowText buildTextStorageForWidth:width]; 
    NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject; 
    NSTextContainer *textContainer = layoutManager.textContainers.firstObject; 
    CGSize computedSize = [layoutManager usedRectForTextContainer:textContainer].size; 

    css_dim_t result; 
    result.dimensions[CSS_WIDTH] = RCTCeilPixelValue(computedSize.width); 
    if (shadowText->_effectiveLetterSpacing < 0) { 
    result.dimensions[CSS_WIDTH] -= shadowText->_effectiveLetterSpacing; 
    } 
    result.dimensions[CSS_HEIGHT] = RCTCeilPixelValue(computedSize.height); 
    return result; 
} 
+3

Bạn có thể giải thích rõ hơn về cách bạn giải quyết nó không? Tôi có một thành phần UI gốc và tôi không thể làm cho RN tính toán khung chính xác: nó luôn bằng không trừ khi tôi mã hóa chiều rộng và chiều cao bằng cách sử dụng kiểu trong RN. – Giuseppe

+0

@Giuseppe Bạn phải thực hiện chức năng RCTMeasure riêng – aksonov

1

Bạn có thể sử dụng các tài sản trên onLayout độ xem văn bản và xem nếu nó có nhiều dòng mà bạn muốn có. Vì vậy, bạn sẽ làm như sau:

  1. sử dụng có chiều rộng ban đầu cho mục văn bản
  2. chờ onLayout để bắn và tính toán bao nhiêu chiều rộng thành phần văn bản của bạn sẽ cần phải dựa trên kích thước render
  3. thiết lập các tính chiều rộng, gây ra hiện tượng lại với chiều rộng được tính
+0

Thành phần tôi đã thực hiện là một UIButton gốc. Phương thức onLayout mà bạn đã đề cập được định nghĩa ở phía React Native, và từ ReactNative, tôi không biết làm thế nào để có được IntentinsContentSize của chế độ xem tùy chỉnh của tôi. – Giuseppe

+0

@Giuseppe xin lỗi vì phản hồi trễ: phương thức onLayout nhận thông tin bố cục gốc được cung cấp bởi trình kết xuất/xếp lớp RN cho bạn: http://facebook.github.io/react-native/releases/0.26/docs/view.html #onlayout –

+0

@DanielSchmidt có vẻ như cách tiếp cận của bạn chỉ hoạt động đối với các thành phần JS chứ không chỉ cho các thành phần của iOS. Nội bộ onLayout sử dụng chức năng RCTMeasure tôi đã mô tả dưới đây ... – aksonov

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