26 Commits

Author SHA1 Message Date
Jeff Verkoeyen
7ae4498a05 [FlexibleHeader] Delete the unused canAlwaysExpandToMaximumHeight API.
PiperOrigin-RevId: 457775121
2022-06-28 11:11:40 -07:00
Jeff Verkoeyen
b5aa93e81c Internal change
PiperOrigin-RevId: 312773402
2020-05-21 17:44:22 -07:00
featherless
a24c11f7fc
[FlexibleHeader] Add MDCFlexibleHeaderShiftBehaviorHideable. (#9026)
This new shift behavior mode enables the flexible header to mimic the behavior of UINavigationController's setNavigationBarHidden:. When the shift behavior is set to this new value, the flexible header can be hidden or shown using the shiftHeaderOnScreenAnimated: and shiftHeaderOffScreenAnimated: APIs, but user interactions will not affect the header's visibility.

Added an example to the configurator to demonstrate the behavior.

Part of https://github.com/material-components/material-components-ios/issues/5185
2019-11-27 16:16:30 -05:00
featherless
f758365a6e [FlexibleHeader] Move all supplemental code into the examples. (#8690)
Standardized the property annotations. Otherwise, this PR is just a move operation and deletion of now unnecessary files.

Polish as part of #8644
2019-10-31 07:14:35 -07:00
Robert Moore
800188a649
{clang-format} Format the components. (#6347)
This is a follow-up to https://github.com/material-components/material-components-ios/pull/6027

```
find components \( -name "*.h" -or -name "*.m" \) | xargs clang-format -i
```
2019-01-23 11:08:43 -05:00
featherless
60d6371582
[FlexibleHeader] Fix shift phase behavior when contained in the tracking scroll view. (#6069)
Closes https://github.com/material-components/material-components-ios/issues/5813

Problem:
Prior to this change, the shift phase values were nonsensical when a flexible header was a child of its tracking scroll view.

Root cause:
The scroll phase value logic was looking at self.frame, which is undefined if self.transform is not the identity. When a flexible header is a child of its tracking scroll view, we modify self.transform in order to keep it "pinned" to the top of the screen. This resulted in unpredictable values for self.frame in the phase calculation logic.

The fix:
Rather than rely on self.frame, we now inspect self.center which is unaffected by self.transform. We calculate what the "top edge" of the flexible header is and feed that value in to the phase calculation logic.

Tested:
Added new log statements to the flexible header configurator demo. Verified that the values output matched the documented behavior of the scroll phase properties.
2018-12-20 16:43:02 -05:00
featherless
3b34e97f5b
[FlexibleHeader] Add new canAlwaysExpandToMaximumHeight behavior. (#4978)
This rolls forward #4794 which was rolled back in v62.0.0.

All runtime logic introduced by #4794 has bee gated behind the new behavioral flag in an effort to maintain existing functionality.

Closes https://github.com/material-components/material-components-ios/issues/4393
2018-08-31 14:11:14 -04:00
featherless
2181084272
[automated] Standardize our open source license stanza to what Xcode generates. (#4985)
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.
```
2018-08-31 12:13:07 -04:00
featherless
349c1915a3
[FlexibleHeader] Add buttons to the configurator demo for shifting the header on/off-screen. (#4979)
Screenshot:

![simulator screen shot - iphone x - 2018-08-31 at 09 13 25](https://user-images.githubusercontent.com/45670/44914406-25c2e380-acfe-11e8-8c79-8d583b5b75a6.png)
2018-08-31 09:51:44 -04:00
featherless
66b8a7edfe
Revert "[FlexibleHeader] Add new canAlwaysExpandToMaximumHeight behavior. (#4794)" (#4976)
This reverts commit 2b3722f7b8cc7df131a8b33695990c99931c0e1b.
2018-08-30 17:28:20 -04:00
featherless
2b3722f7b8
[FlexibleHeader] Add new canAlwaysExpandToMaximumHeight behavior. (#4794)
### Release notes

`canAlwaysExpandToMaximumHeight` is a new behavior on the Flexible Header component that is available through an extension target, `FlexibleHeader+CanAlwaysExpandToMaximumHeight`.

Enabling this behavior on a flexible header instance will allow the flexible header to expand to its maximum height even when the flexible header is floating in front of its content.

---

We intend to keep usage of this API fairly restricted internally, so we have added the behavior as a separate target that we'll whitelist internally to clients. The API is still supported by the typical API contract for public clients.

The behavior is implemented using the same shift accumulator logic that enables header shifting. When the accumulator is positive, we're shifting off-screen. When the accumulator is negative, we're expanding the height of the flexible header.

Closes https://github.com/material-components/material-components-ios/issues/4393
2018-08-23 15:50:37 -04:00
featherless
bb245597d8
[FlexibleHeader] Add behavior for enabling contextual safe area insets (#4596)
This is the first part of a two-part change that addresses the behavior outlined in https://github.com/material-components/material-components-ios/issues/4104. The second part will expose a similar behavior in the AppBar component.

---

This PR introduces a new top safe area inset behavior to the flexible header view, gated behind the runtime flag `inferTopSafeAreaInsetFromViewController`.

When this behavior is enabled, the flexible header will no longer attempt to infer the top safe area inset from the device's insets using `MDCDeviceTopSafeAreaInset`. Instead, it will infer the top safe area inset from the view controller ancestry of the flexible header view controller.

This new behavior addresses a number of issues related to safe area insets, namely:

- https://github.com/material-components/material-components-ios/issues/4104 (incorrect insets when shown in a popover or modal dialog on iPad).
- Flexible headers can now be used in app extensions.
- The flexible header now properly reacts to status bar visibility changes.

### New feature: top safe area guide

This change introduces a new layout guide that can be used to position content within the flexible header view while respecting the top safe area insets. The `topSafeAreaGuide` API is available on the MDCHeaderView instance of the flexible header view controller and supports iOS 8 and up. An example of its usage to align a view to the bottom of the flexible header's top safe area guide:

```
[NSLayoutConstraint constraintWithItem:self.titleLabel
                                  attribute:NSLayoutAttributeTop
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.fhvc.headerView.topSafeAreaGuide
                                  attribute:NSLayoutAttributeBottom
                                 multiplier:1.0
                                   constant:0]
```

The new layout guide works whether `inferTopSafeAreaInsetFromViewController` is enabled or disabled.

### Additional information

If using `MDCFlexibleHeaderContainerViewController`, this new behavior is now enabled by default.

The new behavior (and all of the other "new" behaviors) have been enabled on every FlexibleHeader example.

### Results

A screenshot of the result of this API once enabled on the App Bar:

![simulator screen shot - ipad air - 2018-07-20 at 00 32 36](https://user-images.githubusercontent.com/45670/42983391-747cb1ce-8bb4-11e8-99da-1a70721441ba.png)

### Architecture

This change builds off of the foundation introduced in 80fd217f766e0f5be6a3bc6bef5923f231721f9d. As part of that change, we made it possible to modify a given view controller's top layout guide such that it equalled the top safe area insets + the flexible header height. Unfortunately, that change was still limited by the fact that the flexible header always assumed that it was placed as a full-screen view.

With the new `inferTopSafeAreaInsetFromViewController` behavior, we are able to extract the top safe area inset from our view controller ancestry instead. We can then combine this extracted value with our flexible header's height before ultimately writing that to the target top layout guide. This flow is roughly shown in the following diagram:

![fhv](https://user-images.githubusercontent.com/45670/42982943-df40b38c-8bb1-11e8-9c05-d69959252af1.png)

In order to implement this flow we needed to implement two things:

1. A mechanism by which we could infer the root-most ancestral view controller from which we could extract safe area insets.
2. A mechanism by which we could be notified every time that root view controller's safe area insets changed.

The first mechanism is implemented by `fhv_inferTopSafeAreaSourceViewController` as a simple ancestral traversal. We walk up the view controller tree from the flexible header's parent until we run out of ancestors. There is some nuance to this algorithm, in that we need to ensure that our ancestor isn't our `topLayoutGuideViewController` or we risk creating an infinite loop. If we encounter such a situation we attempt to break the loop by walking up the topLayoutGuideViewController's ancestry instead, but at this point it's very likely we won't have a viable ancestor and we'll throw an assertion if/when we can't find a viable ancester.

With an ancestor in hand, we then determine whether to KVO observe `topLayoutGuide` or `safeAreaInsets` based on whether we're running pre-iOS 11 or iOS 11+, respectively.

KVO then informs us of any changes to the top safe area insets, which we can then propagate through the flexible header view and eventually on to the top layout guide (if `topLayoutGuideAdjustmentEnabled` is also enabled).
2018-07-25 09:39:51 -04:00
Yurii Samsoniuk
2a96682230 Replace unnecessary imports with forward declarations (#2429)
* [Themes] Remove unnecessary imports.

* [TextFields] Remove unnecessary imports.

* [Typography] Do not use an umbrella header inside of a component.

* [Snackbar] Do not use self umbrella header.

* [ActivityIndicator] Do not use self umbrella header.

* [AppBar] Use umbrella headers.

* [AppBar] Remove self import header.

* [ButtonBar] Removed self umbrella header imports.

* [Buttons] Removed self umbrella header imports.

* [Collections] Update imports.

* [Dialogs] Moved import into an m file.

* [Collections] Fixed imports.

* [FeatureHighlight] Removed self umbrealla imports.

* [HeaderStackView] Reordered imports.

* [Ink] Replaced imports with forward declarations.

* [Slider] Replaced self umbrella import use.

* [Snackbar] Removed self umbrella header import.

* [Tabs] Changed math import. Replaced self umbrella header import.

* [Icons] Removed unnecessary imports.

* [Overlay] Replaced umbrella header import.

* [ShapeLibrary] Replace Shapes imports with an umbrella header.

* [Shapes] Replaced imports with forward declarations.

* [AppBar] Replace import with a forward declaration.

* [Examples] Updated imports.

* Fixed conflicting imports

* Added space between different import categories
2017-11-16 18:25:06 -05:00
Andrés
100d18816b [FlexibleHeader] Introduce minMaxHeightIncludesSafeArea and fix rotation bugs. (#2184)
* [FlexibleHeader] Introduce minMaxHeightIncludesSafeArea.

This reverts commit dcadf2d19c6986e6303a584c878e295377070a3e.

* [FlexibleHeader] Adjusts insets when safe area changes.

* WIP

* [FlexibleHeader] Rotation fixes.

* [FlexibleHeader] More fixes.

* [FlexibleHeader] Encode/decode new BOOL

* [FlexibleHeader] Cleanup.

* [Test] Revert test change

* [FlexibleHeader] Rename computed values.

* [FlexibleHeader] _isChangingStatusBarVisibility check.

* [FlexibleHeader] Rename computed properties.

* [FlexibleHeader] Use MDCDeviceTopSafeAreaInset.

* [FlexibleHeader] Review.

* [FlexibleHeader] Document _currentSafeAreaInsetTop.
2017-10-16 11:53:06 -04:00
Andrés
dcadf2d19c Revert "[FlexibleHeader] Introduce minMaxHeightIncludesSafeArea. (#2123)" (#2161)
This reverts commit 4a98cdaa32bd443850590610c95d3576cea32847.
2017-10-12 14:36:55 -04:00
Andrés
4a98cdaa32 [FlexibleHeader] Introduce minMaxHeightIncludesSafeArea. (#2123)
* [FlexibleHeader] Introduce MDCFlexibleHeaderHeightSafeAreaAdjustment for custom heights

* Review

* [FlexibleHeader] Update tests.

* [FlexibleHeader] Jeff's review

* [FlexibleHeader] New API documentation.

* Adding missing break;
2017-10-12 11:45:25 -04:00
Adrian Secord
8c3af252be Adding AUTHORS and removing CONTRIBUTORS.txt.
We can credit any contributor who would like to be credited this way, by adding them on request to the AUTHORS file. The copyright statement changes are required for this to work. Note that this has...

Summary:

We can credit any contributor who would like to be credited this way, by adding them on request to the AUTHORS file. The copyright statement changes are required for this to work. Note that this has no legal change, since the contributors always retained their copyright despite the copyright notice, but it's a nice acknowledgement.

Changed copyright statement to include non-Google authors.

Command run:

find * \( -name '*\.m' -or -name '*\.h' -or -name '*\.swift' \) -and -not \( -path 'scripts/external*' -name Pods  \) -print0 | xargs -0 sed -i '' 's/Copyright \(.*\) Google Inc/Copyright \1 the Material Components for iOS authors/'

Added non-source files.

Command run:

grep -Rl 'Copyright .* Google Inc' * --exclude-dir scripts/external --null | xargs -0 sed -i '' 's/Copyright \(.*\) Google Inc/Copyright \1 the Material Components for iOS authors/'

Reviewers: featherless, O1 Material components iOS, randallli

Reviewed By: O1 Material components iOS, randallli

Tags: #material_components_ios

Differential Revision: http://codereview.cc/D1415
2016-08-08 08:16:37 -07:00
Adrian Secord
3aedace959 Re-enabled 100-character line limit.
Reviewers: randallli, O1 Material components iOS

Reviewed By: randallli, O1 Material components iOS

Tags: #material_components_ios

Differential Revision: http://codereview.cc/D965
2016-06-13 13:34:57 -04:00
Jeff Verkoeyen
1229fc7b26 [FlexibleHeader] Add statusBarCanOverlapHeader property to MDCFlexibleHeaderView.
Summary:
This property makes it possible to use Flexible Header in popovers and non-fullscreen modals.

Closes https://github.com/google/material-components-ios/issues/349.

Reviewers: ajsecord, #mdc_ios_owners

Reviewed By: ajsecord, #mdc_ios_owners

Subscribers: ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D673
2016-04-21 15:41:26 -04:00
Jeff Verkoeyen
9310ae9de1 [FlexibleHeader] Hide header contents in the configurator when the header is shifting.
Summary: Closes https://github.com/google/material-components-ios/issues/323.

Reviewers: #mdc_ios_owners, ajsecord

Reviewed By: #mdc_ios_owners, ajsecord

Subscribers: ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D659
2016-04-20 18:31:17 -04:00
Jeff Verkoeyen
34b656298f [FlexibleHeader] Add status bar visibility switch to configurator example.
Reviewers: #mdc_ios_owners, ajsecord

Reviewed By: #mdc_ios_owners, ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D669
2016-04-20 11:47:16 -04:00
Jeff Verkoeyen
b9b819536b [FlexibleHeader] Configurator example is now a table view.
Summary: Added a new configuration option for header content importance.

Reviewers: #mdc_ios_owners, ajsecord

Reviewed By: #mdc_ios_owners, ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D664
2016-04-19 15:32:00 -04:00
Jeff Verkoeyen
6a5918450d [FlexibleHeader] Configurator demo min/max sliders react to each other.
Summary:
If min slider moves above max slider, max slider adjusts accordingly. Vice versa also applies.

Closes https://github.com/google/material-components-ios/issues/325.

Reviewers: #mdc_ios_owners, ajsecord

Reviewed By: #mdc_ios_owners, ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D586
2016-04-13 09:35:54 -04:00
Will Larche
b0312ed1ad Added nav bar example and small fix to flexible header examples.
Summary: [Examples: NavigationBar] Added nav bar example and small fix to flexible header examples.

Reviewers: featherless, #mdc_ios_owners

Reviewed By: featherless, #mdc_ios_owners

Subscribers: featherless

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D492
2016-04-06 10:35:45 -04:00
Jeff Verkoeyen
d23456c3d7 [FlexibleHeader] Rename behavior to shiftBehavior.
Summary:
Migration guide:
Clients using the `behavior` property can simply replace with `shiftBehavior`.

Closes https://github.com/google/material-components-ios/issues/273.

Reviewers: #mdc_ios_owners, ajsecord

Reviewed By: #mdc_ios_owners, ajsecord

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D483
2016-04-05 11:56:27 -04:00
Will Larche
d3c3389ba0 The New Configurator (Flexible Header View Example)
Summary: Recreated and updated 'Configurator' example for new example schemes and did some cleanup on 'Typical Use'

Reviewers: #mdc_ios_owners, featherless

Reviewed By: #mdc_ios_owners, featherless

Subscribers: featherless

Projects: #material_components_ios

Differential Revision: http://codereview.cc/D460
2016-04-04 10:53:07 -04:00