<h4>
```diff
- Warning - This may break screenshot testing -
```
</h4>
### Context
Currently the badge is centered on the top of the `iconImageView`. The `iconImageView`'s `origin.y` is at 8.883 in MDC because we vertically center the _content_ in the MDCBottomNavigationItemView. We get the _content_ height by:
_contentHeight_ = icon.height + label.height + contentVerticalMargin
_contentVerticalMargin_ is the spacing between the icon and label.
The **_badge_** is 14dp tall. Centering the badge on the `iconImageView`'s `origin.y` puts the badge at 1.883.
### The problem
The badge is too high in relation to the top of the bottom navigation bar and doesn't match internal guidance.
### The fix
Make the badge and iconImageView have the same origin y, giving users more separation between the top of the navigation bar and the top of the badge.
### Related PR
Closes#4731
### Screenshots
| Before | After |
| - | - |
|||
Our creativity knows no bounds.
### Find
```
/\*
*Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
*
*Licensed under the Apache License,? Version 2\.0 \(the "License"\);
*you may not use this file except in compliance with the License\.
*You may obtain a copy of the License at
*
*http://www\.apache\.org/licenses/LICENSE-2\.0
*
*Unless required by applicable law or agreed to in writing,? software
*distributed under the License is distributed on an "AS IS" BASIS,?
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,? either express or implied\.
*See the License for the specific language governing permissions and
*limitations under the License\.
*\*/
```
```
/\*
*Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
*Licensed under the Apache License, Version 2\.0 \(the "License"\);
*you may not use this file except in compliance with the License\.
*You may obtain a copy of the License at
*http://www\.apache\.org/licenses/LICENSE-2\.0
*Unless required by applicable law or agreed to in writing, software
*distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
*See the License for the specific language governing permissions and
*limitations under the License\.
*\*/
```
```
/\*
*Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
*
*Licensed under the Apache License, Version 2\.0 \(the "License"\);
*you may not use this file except in compliance with the License\.
*You may obtain a copy of the License at
*
*http://www\.apache\.org/licenses/LICENSE-2\.0
*
*Unless required by applicable law or agreed to in writing, software
*distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
*See the License for the specific language governing permissions and
*limitations under the License\.
*\*/
```
```
/\*
*Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
*
*Licensed under the Apache License, Version 2\.0 \(the "License"\);
*you may not use this file except in compliance with the License\.
*You may obtain a copy of the License at
*
*http://www\.apache\.org/licenses/LICENSE-2\.0
*
*Unless required by applicable law or agreed to in writing, software
*distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
*See the License for the specific language governing permissions and
*limitations under the License\.
*\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
+Licensed under the Apache License, Version 2\.0 \(the "License"\);
+you may not use this file except in compliance with the License\.
+You may obtain a copy of the License at
+http://www\.apache\.org/licenses/LICENSE-2\.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
+See the License for the specific language governing permissions and
+limitations under the License\. *\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
+Licensed under the Apache License, Version 2\.0 \(the "License"\);
+you may not use this file except in compliance with the License\.
+You may obtain a copy of the License at
+http://www\.apache\.org/licenses/LICENSE-2\.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
+See the License for the specific language governing permissions and
+limitations under the License\.
*\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\)
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
### Replace
```
// Copyright $1-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
```
Removes the need to copy-paste stanzas from other files anymore as we'll rely on #4478 to generate the correct stanza for us instead.
This was an automated change generated by running a find-and-replace regular expression:
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
// Copyright $1-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
```
Removes the need to copy-paste stanzas from other files anymore as we'll rely on https://github.com/material-components/material-components-ios/pull/4478 to generate the correct stanza for us instead.
This was an automated change generated by running a find-and-replace regular expression:
### Find
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
```
/\*
Copyright ([0-9]+)-present the Material Components for iOS authors\. All Rights Reserved\.
Licensed under the Apache License, Version 2\.0 \(the "License"\);
you may not use this file except in compliance with the License\.
You may obtain a copy of the License at
http://www\.apache\.org/licenses/LICENSE-2\.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied\.
See the License for the specific language governing permissions and
limitations under the License\.
\*/
```
### Replace
```
// Copyright $1-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
```
All items should share the same (ink) ripple color, based on the
`selectedItemTintColor`. For currently-unselected items, the ripple color
would only be updated if the `unselectedItemTintColor` property was set.
The problem was caused by earlier behavior where the ripple color would be
derived from the current state of the button. If an unselected item were
pressed, its ripple color would be based on the `unselectedItemTintColor`.
That behavior was changed so that the `selectedItemTintColor` was used for the
ripple color in all states, but the logic was not moved outside of the
state-based conditional logic.
||Animated Screenshot|
|--|--|
|Before | |
|After | |
Closes#4937
We can now make use of @available throughout our codebase.
We support Xcode 9 and up, which includes the iOS 11 SDK. This means we can remove any guards for SDKs prior to iOS 11.
This was cleaned up by running a global find-and-replace with the following regular expression:
```
Find:#if defined\(__IPHONE_11_0\) && \(__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0\)\n(.+if \(@available\(iOS 11.0, \*\)\) \{(?:.|\n)*?)(?:#else(?:.|\n)*?)?\n#endif
Replace:$1
```
With some additional cleanup for stragglers that didn't match this pattern. Note that else clauses were intentionally dropped.
Closes https://github.com/material-components/material-components-ios/issues/4909
Many of our Swift examples are either missing imports or are importing all of
MaterialComponents. Both of these will cause failures during internal builds.
This change further formalizes our pattern of annotating APIs that will be or are deprecated using class categories. Moving an API into such a category has the benefit of being picked up by the API diff toolchain and elevated into our release notes as a result.
When the `badgeValue` property is updated, the `accessibilityValue` of the
item view should also be updated. However, recent changes to improve
accessibility resulted in the first badge value persisting forever as the
accessibilityValue (unless accessibilityValue was updated manually).
Fixes#4733
* Explicitly update label visibility after titleVisibility is set
* Add unit test for titleVisibility
* Make switch statement less explicit and fewer lines
Ink ripple animations were being delayed. It appears that the root cause is
somewhere in how UIButton forwards `UIControlEventTouchDown`. Migrating to
MDCInkTouchController fixed the issue.
Closes#4586
* Give UITabBarItems' accessibilityIdentifiers to MDCBottomNavigationBar's items' buttons
* KVO tab bar item accessibilityIdentifier in MDCBottomNavigationItemView
* Add unit test for tracking UITabBarItem accessibilityIdentifier
* Fix KVO and associated spec
* Move accessibilityIdentifier spec
We were seeing the following error on builds of apps that support iOS 10 and up:
components/BottomNavigation/src/MDCBottomNavigationBar.m:200:8: Comparison of address of 'UIAccessibilityTraitTabBar' not equal to a null pointer is always true
We still support iOS 8 and up, so the code's behavior is valid when building against pre-iOS 10 SDKs. For 10 and up, the error is true (the comparison will always return true), but this is intentional, so we are disabling the warning.
* Give MDCBottomNavigationBar a TabBar accessibilityTrait
* Use @available instead of #if defined blah blah blah
* Go back to #if defined blah blah blah
* Try adding some warning suppressions
Two files were using C99 `bool` instead of Objective-C `BOOL` types. This
could lead to breakages in the future if the `BOOL` type were redefined by the
Objective-C headers.
Added an example to showcase when items are reset to an new array.
Fixed the bug when we reset items and they don't layout correctly.
After a reset, set the selected tab to Null to mirror UITabBar
https://developer.apple.com/documentation/uikit/uitabbar/1623453-selecteditem?language=objc
Added two test to check for selection being Null after a reset and frames not being zero after a reset.
Closes#4429
* Add example when we explicitly set color of bottom navigation bar
* Clean up app bar stuff and move code out of init.
* Fix error with appBar
* Remove lines where I set color and remove extra example from this PR.
* Fix whitespace issue
* Adjust colors and tags.
* Change tags and colors, forgot to add this to the last commit.
* Fix setItems bug
* Clean up changes I didn't intend to include
* Add test to make sure when we add items they don't just continue to append to the array but reset it back to empty then add the items.
* Update the test so we set twice.
* Add line.
* Update test to use same type in comparison.
* Use NSUInt instead of unsigned int.
* Undo whitespace changes.
When title strings are very long (as may be common in localization to
non-default languages), MDCBottomNavigationBar was incorrectly computing the
expected height of the title label. Instead of querying the NSString for its
bounding rect, we can allow the UILabel to size itself and simply restrict
its width to the tab's width.
Closes#4040
As part of our readme generator, components can now opt in to displaying badges in their readme.
The badges are generated from https://shields.io/ and are focused on an individual component. We're currently generating the following badges:
- Open bug count.
This discourages depending on all of a component's extensions and aligns our targets more closely with how we expect them to be imported and depended upon.
This is a breaking change.
Pivotal story: https://www.pivotaltracker.com/story/show/157118721
* Updated known shortlink destination URLs to use short links.
* Updated stray links in the CHANGELOG.md.
* Fixed FAB shortlink.
* Applied replacements to everything outside of components/.