ios11透明导航栏
ios 11 transparent navigation bar
创建透明导航栏不再适用于 ios11。
我在顶部得到了这个黑条,因为 table 视图不再位于条下方(情节提要中的插图已正确设置为从 0 开始)
有什么想法吗?
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
我遇到了类似的问题。我在故事板中为 UIViewController 设置了 "Extended Edges: Under Top/Bottom/Opaque Bar" true。
Like this.
您也可以尝试禁用“Automatically Adjusts Scroll View Insets”
旧:
如果你用过tableView,添加代码:
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever
} else {
self.automaticallyAdjustsScrollViewInsets = NO
}
新:
在 iOS11 中更改了 automaticallyAdjustsScrollViewInsets:
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's
contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0));
// Defaults to YES
关于 contentInsetAdjustmentBehavior:
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));
/* Configure the behavior of adjustedContentInset.
Default is UIScrollViewContentInsetAdjustmentAutomatic.
*/
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));
可能是 iOS11 的安全区域问题。
试试这个来自一位专家的定义:
#define adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)
我遇到了同样的问题,我能够解决它。
这对我有用:
public override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.isTranslucent = true
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
} else {
// Fallback on earlier versions
}
}
还有一件事,我发现仍然有必要让它发挥作用。很可能您的 UICollectionView/UITableView/UIScrollview 与安全区域的顶部对齐。改为将此约束更改为与超级视图的顶部对齐。
就是这样。是不是直截了当又直观?谢谢苹果。
要在 iOS 10 和 11 之间保持一致的行为,请尝试将其添加到您的 navigationViewController
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if navigationBar.isTranslucent, #available(iOS 11.0, *) {
viewController.additionalSafeAreaInsets.top = -navigationBar.bounds.height
}
}
创建透明导航栏不再适用于 ios11。 我在顶部得到了这个黑条,因为 table 视图不再位于条下方(情节提要中的插图已正确设置为从 0 开始) 有什么想法吗?
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
我遇到了类似的问题。我在故事板中为 UIViewController 设置了 "Extended Edges: Under Top/Bottom/Opaque Bar" true。 Like this. 您也可以尝试禁用“Automatically Adjusts Scroll View Insets”
旧:
如果你用过tableView,添加代码:
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever
} else {
self.automaticallyAdjustsScrollViewInsets = NO
}
新:
在 iOS11 中更改了 automaticallyAdjustsScrollViewInsets:
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's
contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0));
// Defaults to YES
关于 contentInsetAdjustmentBehavior:
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));
/* Configure the behavior of adjustedContentInset.
Default is UIScrollViewContentInsetAdjustmentAutomatic.
*/
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));
可能是 iOS11 的安全区域问题。 试试这个来自一位专家的定义:
#define adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)
我遇到了同样的问题,我能够解决它。 这对我有用:
public override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.isTranslucent = true
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
} else {
// Fallback on earlier versions
}
}
还有一件事,我发现仍然有必要让它发挥作用。很可能您的 UICollectionView/UITableView/UIScrollview 与安全区域的顶部对齐。改为将此约束更改为与超级视图的顶部对齐。
就是这样。是不是直截了当又直观?谢谢苹果。
要在 iOS 10 和 11 之间保持一致的行为,请尝试将其添加到您的 navigationViewController
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if navigationBar.isTranslucent, #available(iOS 11.0, *) {
viewController.additionalSafeAreaInsets.top = -navigationBar.bounds.height
}
}