浏览代码

bugfix: sizeThatFit:

ibireme 9 年之前
父节点
当前提交
9338ce9c6b
共有 2 个文件被更改,包括 55 次插入17 次删除
  1. 34 3
      YYText/YYLabel.m
  2. 21 14
      YYText/YYTextView.m

+ 34 - 3
YYText/YYLabel.m

@@ -450,9 +450,40 @@ static dispatch_queue_t YYLabelGetReleaseQueue() {
 }
 
 - (CGSize)sizeThatFits:(CGSize)size {
-    [self _updateIfNeeded];
-    if (!_innerLayout) return size;
-    return [_innerLayout textBoundingSize];
+    if (_ignoreCommonProperties) {
+        return _innerLayout.textBoundingSize;
+    }
+    
+    if ((!_verticalForm && size.width == self.bounds.size.width) ||
+        (_verticalForm && size.height == self.bounds.size.height)) {
+        [self _updateIfNeeded];
+        YYTextLayout *layout = self._innerLayout;
+        BOOL contains = NO;
+        if (layout.container.maximumNumberOfRows == 0) {
+            if (layout.truncatedLine == nil) {
+                contains = YES;
+            }
+        } else {
+            if (layout.rowCount <= layout.container.maximumNumberOfRows) {
+                contains = YES;
+            }
+        }
+        if (contains) {
+            return layout.textBoundingSize;
+        }
+    }
+    
+    if (!_verticalForm) {
+        size.height = YYTextContainerMaxSize.height;
+    } else {
+        size.width = YYTextContainerMaxSize.width;
+    }
+    
+    YYTextContainer *container = [_innerContainer copy];
+    container.size = size;
+    
+    YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:_innerText];
+    return layout.textBoundingSize;
 }
 
 - (NSString *)accessibilityLabel {

+ 21 - 14
YYText/YYTextView.m

@@ -2467,24 +2467,31 @@ typedef NS_ENUM(NSUInteger, YYTextMoveDirection) {
 }
 
 - (CGSize)sizeThatFits:(CGSize)size {
-    YYTextLayout *textLayout = self.textLayout;
-    CGSize currentSize = YYTextCGSizePixelCeil(textLayout.textBoundingSize);
-    if (_verticalForm) {
-        if (currentSize.height == size.height) return currentSize;
-    } else {
-        if (currentSize.width == size.width) return currentSize;
+    if ((!_verticalForm && size.width == self.bounds.size.width) ||
+        (_verticalForm && size.height == self.bounds.size.height)) {
+        [self _updateIfNeeded];
+        if (!_verticalForm) {
+            if (_containerView.bounds.size.height <= size.height) {
+                return _containerView.bounds.size;
+            }
+        } else {
+            if (_containerView.bounds.size.width <= size.width) {
+                return _containerView.bounds.size;
+            }
+        }
     }
     
-    if (_verticalForm) {
-        size.width = CGFLOAT_MAX;
+    if (!_verticalForm) {
+        size.height = YYTextContainerMaxSize.height;
     } else {
-        size.height = CGFLOAT_MAX;
+        size.width = YYTextContainerMaxSize.width;
     }
-    YYTextContainer *newContainer = _innerContainer.copy;
-    newContainer.size = size;
-    YYTextLayout *newLayout = [YYTextLayout layoutWithContainer:newContainer text:textLayout.text];
-    CGSize newSize = newLayout.textBoundingSize;
-    return YYTextCGSizePixelCeil(newSize);
+    
+    YYTextContainer *container = [_innerContainer copy];
+    container.size = size;
+    
+    YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:_innerText];
+    return layout.textBoundingSize;
 }
 
 #pragma mark - Override UIResponder