Просмотр исходного кода

Merge pull request #1345 from onevcat/fix/unconstraint-size

Fix unconstraint size
Wei Wang 6 лет назад
Родитель
Сommit
93e595aeef
2 измененных файлов с 32 добавлено и 0 удалено
  1. 11 0
      Sources/Extensions/ImageView+Kingfisher.swift
  2. 21 0
      Sources/Views/Indicator.swift

+ 11 - 0
Sources/Extensions/ImageView+Kingfisher.swift

@@ -356,6 +356,17 @@ extension KingfisherWrapper where Base: KFCrossPlatformImageView {
                     equalTo: base.centerXAnchor, constant: newIndicator.centerOffset.x).isActive = true
                 view.centerYAnchor.constraint(
                     equalTo: base.centerYAnchor, constant: newIndicator.centerOffset.y).isActive = true
+
+                switch newIndicator.sizeStrategy(in: base) {
+                case .intrinsicSize:
+                    break
+                case .full:
+                    view.heightAnchor.constraint(equalTo: base.heightAnchor, constant: 0).isActive = true
+                    view.widthAnchor.constraint(equalTo: base.widthAnchor, constant: 0).isActive = true
+                case .size(let size):
+                    view.heightAnchor.constraint(equalToConstant: size.height).isActive = true
+                    view.widthAnchor.constraint(equalToConstant: size.width).isActive = true
+                }
                 
                 newIndicator.view.isHidden = true
             }

+ 21 - 0
Sources/Views/Indicator.swift

@@ -67,6 +67,16 @@ public protocol Indicator {
     
     /// The indicator view which would be added to the super view.
     var view: IndicatorView { get }
+
+    /// The size strategy used when adding the indicator to image view.
+    /// - Parameter imageView: The super view of indicator.
+    func sizeStrategy(in imageView: KFCrossPlatformImageView) -> IndicatorSizeStrategy
+}
+
+public enum IndicatorSizeStrategy {
+    case intrinsicSize
+    case full
+    case size(CGSize)
 }
 
 extension Indicator {
@@ -74,6 +84,13 @@ extension Indicator {
     /// Default implementation of `centerOffset` of `Indicator`. The default value is `.zero`, means that there is
     /// no offset for the indicator view.
     public var centerOffset: CGPoint { return .zero }
+
+
+    /// Default implementation of `centerOffset` of `Indicator`. The default value is `.full`, means that the indicator
+    /// will pin to the same height and width as the image view.
+    public func sizeStrategy(in imageView: KFCrossPlatformImageView) -> IndicatorSizeStrategy {
+        return .full
+    }
 }
 
 // Displays a NSProgressIndicator / UIActivityIndicatorView
@@ -114,6 +131,10 @@ final class ActivityIndicator: Indicator {
         }
     }
 
+    func sizeStrategy(in imageView: KFCrossPlatformImageView) -> IndicatorSizeStrategy {
+        return .intrinsicSize
+    }
+
     init() {
         #if os(macOS)
             activityIndicatorView = NSProgressIndicator(frame: CGRect(x: 0, y: 0, width: 16, height: 16))