Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 18 additions & 10 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,26 @@

### Fixed

### Added

### Removed

### Changed

### Misc

### Internal

# Past Releases

# 17.4.0 - 2026-08-03

### Fixed

- Fixed a scroll completion handler being stranded when an `animated: true` scroll was requested inside a `UIView.performWithoutAnimation` block. The suppressed scroll never produced a `scrollViewDidEndScrollingAnimation(_:)` callback, so the handler it was queued for was never reported.

- Fixed a scroll completion handler being stranded when an animated scroll had nowhere to go — scrolling to the top while already at the top, for example. `setContentOffset(_:animated: true)` with the offset the scroll view is already at starts no animation, so the `scrollViewDidEndScrollingAnimation(_:)` callback the handler was queued for never arrived. Such a scroll now reports the way an unanimated one does, on the next runloop pass.

### Added

- Added `ScrollAnimation`, which lets a programmatic scroll run over a specific duration. `UIScrollView` provides no way to configure its built-in animation, so previously a scroll was either instant or ran at a fixed system speed.
Expand All @@ -22,16 +40,6 @@

- Added `completion` handlers to `scrollToTop(...)` and `scrollToLastItem(...)`, which previously had no way to report when they finished.

### Removed

### Changed

### Misc

### Internal

# Past Releases

# 17.3.0 - 2026-06-16

### Added
Expand Down
6 changes: 3 additions & 3 deletions docs/BlueprintLists/Functions.html
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">@inline</span><span class="p">(</span><span class="n">__always</span><span class="p">)</span>
<pre class="highlight swift"><code><span class="kd">@inline(__always)</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">preconditionFailure</span><span class="p">(</span>
<span class="n">_</span> <span class="nv">message</span><span class="p">:</span> <span class="kd">@autoclosure</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">String</span> <span class="o">=</span> <span class="kt">String</span><span class="p">(),</span>
<span class="nv">file</span><span class="p">:</span> <span class="kt">StaticString</span> <span class="o">=</span> <span class="kd">#file</span><span class="p">,</span>
Expand Down Expand Up @@ -329,7 +329,7 @@ <h3 id='note' class='heading'>Note</h3>
<p>If your item is to be used in more than one place, it is recommended that you
create a <code><a href="Protocols/BlueprintItemContent.html">BlueprintItemContent</a></code> struct to share logic to avoid duplicate code.</p>
<h3 id='example' class='heading'>Example</h3>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="p">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="k">in</span>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="err">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="k">in</span>
<span class="n">lhs</span><span class="o">.</span><span class="n">value</span> <span class="o">!=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">value</span>
<span class="p">}</span> <span class="nv">element</span><span class="p">:</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">PodcastElement</span><span class="p">(</span><span class="nv">podcast</span><span class="p">:</span> <span class="n">podcast</span><span class="p">)</span>
Expand Down Expand Up @@ -392,7 +392,7 @@ <h3 id='note' class='heading'>Note</h3>
<p>If your item is to be used in more than one place, it is recommended that you
create a <code><a href="Protocols/BlueprintItemContent.html">BlueprintItemContent</a></code> struct to share logic to avoid duplicate code.</p>
<h3 id='example' class='heading'>Example</h3>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="p">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="err">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">PodcastElement</span><span class="p">(</span><span class="nv">podcast</span><span class="p">:</span> <span class="n">podcast</span><span class="p">)</span>
<span class="p">}</span> <span class="nv">background</span><span class="p">:</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">Box</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="p">`</span><span class="nv">Self</span><span class="p">`)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="err">`</span><span class="k">Self</span><span class="err">`</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>

</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion docs/BlueprintLists/Structs/ElementItemContent.html
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="p">`</span><span class="nv">Self</span><span class="p">`)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="err">`</span><span class="k">Self</span><span class="err">`</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>

</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">@inline</span><span class="p">(</span><span class="n">__always</span><span class="p">)</span>
<pre class="highlight swift"><code><span class="kd">@inline(__always)</span>
<span class="kd">public</span> <span class="kd">func</span> <span class="nf">preconditionFailure</span><span class="p">(</span>
<span class="n">_</span> <span class="nv">message</span><span class="p">:</span> <span class="kd">@autoclosure</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">String</span> <span class="o">=</span> <span class="kt">String</span><span class="p">(),</span>
<span class="nv">file</span><span class="p">:</span> <span class="kt">StaticString</span> <span class="o">=</span> <span class="kd">#file</span><span class="p">,</span>
Expand Down Expand Up @@ -329,7 +329,7 @@ <h3 id='note' class='heading'>Note</h3>
<p>If your item is to be used in more than one place, it is recommended that you
create a <code><a href="Protocols/BlueprintItemContent.html">BlueprintItemContent</a></code> struct to share logic to avoid duplicate code.</p>
<h3 id='example' class='heading'>Example</h3>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="p">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="k">in</span>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="err">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="k">in</span>
<span class="n">lhs</span><span class="o">.</span><span class="n">value</span> <span class="o">!=</span> <span class="n">rhs</span><span class="o">.</span><span class="n">value</span>
<span class="p">}</span> <span class="nv">element</span><span class="p">:</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">PodcastElement</span><span class="p">(</span><span class="nv">podcast</span><span class="p">:</span> <span class="n">podcast</span><span class="p">)</span>
Expand Down Expand Up @@ -392,7 +392,7 @@ <h3 id='note' class='heading'>Note</h3>
<p>If your item is to be used in more than one place, it is recommended that you
create a <code><a href="Protocols/BlueprintItemContent.html">BlueprintItemContent</a></code> struct to share logic to avoid duplicate code.</p>
<h3 id='example' class='heading'>Example</h3>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="p">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<pre class="highlight swift"><code><span class="kt">ElementItem</span><span class="p">(</span><span class="n">podcast</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="err">\</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">PodcastElement</span><span class="p">(</span><span class="nv">podcast</span><span class="p">:</span> <span class="n">podcast</span><span class="p">)</span>
<span class="p">}</span> <span class="nv">background</span><span class="p">:</span> <span class="p">{</span> <span class="n">podcast</span><span class="p">,</span> <span class="n">info</span> <span class="k">in</span>
<span class="kt">Box</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="p">`</span><span class="nv">Self</span><span class="p">`)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="err">`</span><span class="k">Self</span><span class="err">`</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>

</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ <h4>Declaration</h4>
<h4>Declaration</h4>
<div class="language">
<p class="aside-title">Swift</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="p">`</span><span class="nv">Self</span><span class="p">`)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">func</span> <span class="nf">isEquivalent</span><span class="p">(</span><span class="n">to</span> <span class="nv">other</span><span class="p">:</span> <span class="err">`</span><span class="k">Self</span><span class="err">`</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>

</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ <h3 id='self-sizing-cells' class='heading'>Self-Sizing Cells</h3>
<p>Another common pain-point for standard <code>UITableViews</code> or <code>UICollectionViews</code> is handling dynamic and self sizing cells. Listable handles this transparently for you, and provides many ways to size content. Each <code>Item</code> has a <code>sizing</code> property, which can be set to any of the following values. <code>.default</code> pulls the default sizing of the item from the <code><a href="Structs/List/Measurement.html">List.Measurement</a></code> mentioned above, where as the <code>thatFits</code> and <code>autolayout</code> values size the item based on <code>sizeThatFits</code> and <code>systemLayoutSizeFitting</code>, respectively.</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">enum</span> <span class="kt">Sizing</span> <span class="p">:</span> <span class="kt">Equatable</span>
<span class="p">{</span>
<span class="k">case</span> <span class="p">`</span><span class="nv">default</span><span class="p">`</span>
<span class="k">case</span> <span class="err">`</span><span class="k">default</span><span class="err">`</span>

<span class="k">case</span> <span class="nf">fixed</span><span class="p">(</span><span class="kt">CGFloat</span><span class="p">)</span>

Expand Down
Binary file modified docs/BlueprintLists/docsets/BlueprintLists.tgz
Binary file not shown.
2 changes: 1 addition & 1 deletion docs/BlueprintLists/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ <h3 id='self-sizing-cells' class='heading'>Self-Sizing Cells</h3>
<p>Another common pain-point for standard <code>UITableViews</code> or <code>UICollectionViews</code> is handling dynamic and self sizing cells. Listable handles this transparently for you, and provides many ways to size content. Each <code>Item</code> has a <code>sizing</code> property, which can be set to any of the following values. <code>.default</code> pulls the default sizing of the item from the <code><a href="Structs/List/Measurement.html">List.Measurement</a></code> mentioned above, where as the <code>thatFits</code> and <code>autolayout</code> values size the item based on <code>sizeThatFits</code> and <code>systemLayoutSizeFitting</code>, respectively.</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">enum</span> <span class="kt">Sizing</span> <span class="p">:</span> <span class="kt">Equatable</span>
<span class="p">{</span>
<span class="k">case</span> <span class="p">`</span><span class="nv">default</span><span class="p">`</span>
<span class="k">case</span> <span class="err">`</span><span class="k">default</span><span class="err">`</span>

<span class="k">case</span> <span class="nf">fixed</span><span class="p">(</span><span class="kt">CGFloat</span><span class="p">)</span>

Expand Down
3 changes: 3 additions & 0 deletions docs/Listable/Classes.html
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,9 @@
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/RefreshControl/Title.html">– Title</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/ScrollAnimation.html">ScrollAnimation</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/ScrollPosition.html">ScrollPosition</a>
</li>
Expand Down
3 changes: 3 additions & 0 deletions docs/Listable/Classes/AnyIdentifier.html
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,9 @@
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/RefreshControl/Title.html">– Title</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollAnimation.html">ScrollAnimation</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollPosition.html">ScrollPosition</a>
</li>
Expand Down
3 changes: 3 additions & 0 deletions docs/Listable/Classes/DefaultItemContentCoordinator.html
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,9 @@
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/RefreshControl/Title.html">– Title</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollAnimation.html">ScrollAnimation</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollPosition.html">ScrollPosition</a>
</li>
Expand Down
3 changes: 3 additions & 0 deletions docs/Listable/Classes/DynamicSource.html
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,9 @@
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/RefreshControl/Title.html">– Title</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollAnimation.html">ScrollAnimation</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollPosition.html">ScrollPosition</a>
</li>
Expand Down
3 changes: 3 additions & 0 deletions docs/Listable/Classes/Identifier.html
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,9 @@
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/RefreshControl/Title.html">– Title</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollAnimation.html">ScrollAnimation</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="../Structs/ScrollPosition.html">ScrollPosition</a>
</li>
Expand Down
Loading
Loading