gpt4 book ai didi

ios - 无法缩小 UIWebView 和 UINavigationBar 之间的差距

转载 作者:行者123 更新时间:2023-11-28 22:31:29 28 4
gpt4 key购买 nike

在我的项目中,我在 UINavigationBar 下放置了一个 UIWebView 并设置 UIWebView 以占据除 以外的屏幕其余部分UINavigationBar.但是我发现两个控件之间存在一些差距。左边缘和 UIWebView 左侧之间也有间隙。知道我错过了什么吗?

enter image description here

这是我更新后的代码:在 UIView+AutoLayout 中:(此类别会将所有 View 的 translatesAutoresizingMaskIntoConstraints 属性设置为 NO)

#import "UIView+AutoLayout.h"

@implementation UIView (AutoLayout)
+ (id)autolayoutView
{
UIView *view = [self new];
view.translatesAutoresizingMaskIntoConstraints = NO;
return view;
}
@end

在 View Controller 中:

- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationBar = [UINavigationBar autolayoutView];
UINavigationItem *backToListItem = [[UINavigationItem alloc] init];
UIBarButtonItem *listItem = [[UIBarButtonItem alloc] initWithTitle:@"List" style:UIBarButtonItemStylePlain target:self action:@selector(listButtonPressed:)];
backToListItem.leftBarButtonItem = listItem;

self.navigationBar.items = [NSArray arrayWithObject:backToListItem];

[self.view addSubview:self.navigationBar];

self.webView = [TNSWebView autolayoutView];

[self.view addSubview:self.webView];

NSDictionary *views = NSDictionaryOfVariableBindings(_navigationBar, _webView);
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"|[_navigationBar]|"
options:0 metrics:nil
views:views]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[_navigationBar]->=0-[_webView]|"
options:0 metrics:nil
views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_webView]|" options:0 metrics:nil views:views]];
[self.webView setupVideoPlayer:self.videoId];
}

lldb 中使用 po [[UIWindow keyWindow] recursiveDescription] 命令我得到了这个结果

    | <UIView: 0x1d23f880; frame = (0 20; 768 1004); autoresize = RM+BM; layer = <CALayer: 0x1d23cba0>>
| | <UINavigationBar: 0x1d00a4b0; frame = (0 0; 768 44); gestureRecognizers = <NSArray: 0x1d015ff0>; layer = <CALayer: 0x1d0c8f60>>
| | | <_UINavigationBarBackground: 0x1d010250; frame = (0 0; 768 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d011140>>
| | | | <UIImageView: 0x1d0d26b0; frame = (0 44; 768 3); opaque = NO; autoresize = W+TM; userInteractionEnabled = NO; layer = <CALayer: 0x1d23fbd0>>
| | | <UINavigationItemView: 0x1d016740; frame = (384 22; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d016840>>
| | | <UINavigationButton: 0x1d013ff0; frame = (7 7; 48 30); opaque = NO; layer = <CALayer: 0x1d014170>>
| | | | <UIImageView: 0x1c5d9ca0; frame = (0 0; 48 30); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1c58b330>>
| | | | <UIButtonLabel: 0x1d0144c0; frame = (13 7; 22 15); text = 'List'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d014560>>
| | <TNSWebView: 0x1d016bc0; baseClass = UIWebView; frame = (0 44; 768 960); layer = <CALayer: 0x1d016ca0>>
| | | <_UIWebViewScrollView: 0x1d012390; frame = (0 0; 768 960); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x1d011380>; layer = <CALayer: 0x1d0125e0>; contentOffset: {0, 0}>
| | | | <UIImageView: 0x1d00f2a0; frame = (0 0; 10 10); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00f300>>
| | | | <UIImageView: 0x1d00f210; frame = (0 0; 10 10); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00f270>>
| | | | <UIImageView: 0x1d00f180; frame = (0 0; 10 10); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00f1e0>>
| | | | <UIImageView: 0x1d00efb0; frame = (0 0; 10 10); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00f150>>
| | | | <UIImageView: 0x1d00ef20; frame = (-4.5 4.5; 10 1); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00ef80>>
| | | | <UIImageView: 0x1d00ee90; frame = (-4.5 4.5; 10 1); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00eef0>>
| | | | <UIImageView: 0x1d00ee00; frame = (0 0; 1 10); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00ee60>>
| | | | <UIImageView: 0x1d00ec30; frame = (0 0; 1 10); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00edd0>>
| | | | <UIImageView: 0x1d00eba0; frame = (0 954; 768 6); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00ec00>>
| | | | <UIImageView: 0x1d00fcd0; frame = (0 0; 768 6); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d00fe70>>
| | | | <UIWebBrowserView: 0x1dbf2400; frame = (0 0; 768 960); gestureRecognizers = <NSArray: 0x1d014c40>; layer = <UIWebLayer: 0x1d017d00>>
| | | | | <TileHostLayer: 0x1d017e70> (layer)
| | | | | | <TileLayer: 0x1c5511a0> (layer)
| | | | | | <TileLayer: 0x1c551210> (layer)
| | | | | | <TileLayer: 0x1c551250> (layer)
| | | | | | <TileLayer: 0x1c551290> (layer)

更新后的截图:

enter image description here

只需将导航栏的高度更改为 44 并使用 recursiveDescription 命令,我得到:

$0 = 0x2008f680 <UIWindow: 0x1ed814f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <UIWindowLayer: 0x1ed815f0>>
| <UIView: 0x20167680; frame = (0 20; 768 1004); autoresize = RM+BM; layer = <CALayer: 0x1ed0ea50>>
| | <UINavigationBar: 0x1ed14b70; frame = (0 0; 768 44); gestureRecognizers = <NSArray: 0x20081bd0>; layer = <CALayer: 0x1ed09ff0>>
| | | <_UINavigationBarBackground: 0x1ed8b9b0; frame = (0 0; 768 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1ed08570>>
| | | | <UIImageView: 0x2007aa90; frame = (0 44; 768 3); opaque = NO; autoresize = W+TM; userInteractionEnabled = NO; layer = <CALayer: 0x200f9640>>
| | | <UINavigationItemView: 0x20053320; frame = (384 22; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f9c30>>
| | | <UINavigationButton: 0x200fa980; frame = (7 7; 48 30); opaque = NO; layer = <CALayer: 0x200f50c0>>
| | | | <UIImageView: 0x2016af20; frame = (0 0; 48 30); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x2016af80>>
| | | | <UIButtonLabel: 0x2004e420; frame = (13 7; 22 15); text = 'List'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f8040>>
| | <TNSWebView: 0x2004d660; baseClass = UIWebView; frame = (0 44; 768 960); layer = <CALayer: 0x20053f20>>
| | | <_UIWebViewScrollView: 0x2004a230; frame = (0 0; 768 960); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0x20049700>; layer = <CALayer: 0x2004a6c0>; contentOffset: {0, 0}>
| | | | <UIImageView: 0x20048d50; frame = (0 0; 10 10); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x20048db0>>
| | | | <UIImageView: 0x20048cc0; frame = (0 0; 10 10); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x20048d20>>
| | | | <UIImageView: 0x20048c30; frame = (0 0; 10 10); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x20048c90>>
| | | | <UIImageView: 0x200f7c50; frame = (0 0; 10 10); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x20048c00>>
| | | | <UIImageView: 0x200f7bc0; frame = (-4.5 4.5; 10 1); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f7c20>>
| | | | <UIImageView: 0x200f7b30; frame = (-4.5 4.5; 10 1); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f7b90>>
| | | | <UIImageView: 0x200f7a30; frame = (0 0; 1 10); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f7b00>>
| | | | <UIImageView: 0x200f7890; frame = (0 0; 1 10); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200f7a00>>
| | | | <UIImageView: 0x200fad20; frame = (0 954; 768 6); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200fad80>>
| | | | <UIImageView: 0x200fab80; frame = (0 0; 768 6); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x200facf0>>
| | | | <UIWebBrowserView: 0x1fb37600; frame = (0 0; 768 960); gestureRecognizers = <NSArray: 0x20049910>; layer = <UIWebLayer: 0x200f81c0>>
| | | | | <TileHostLayer: 0x2004ed10> (layer)
| | | | | | <TileLayer: 0x20168820> (layer)
| | | | | | <TileLayer: 0x20168890> (layer)
| | | | | | <TileLayer: 0x201688d0> (layer)
| | | | | | <TileLayer: 0x20168910> (layer)

最佳答案

更新

我收回这一切。您的问题不在于 View 布局。我相信您的问题是您加载到 WebView 中的网络内容周围有边框(或填充或边距)。你可能会发现 “Debugging Web Content on iOS”有用。它解释了如何使用 Safari(在您的 Mac 上)中的 Web Inspector 来调试在模拟器或设备上运行的 UIWebView 中的内容。我认为如果您检查 Web 内容中的视频元素,您会发现它没有与视口(viewport)的顶部和左侧边距齐平。

原创

我猜想当您在 viewDidLoad 中查看时,导航栏的高度设置不正确。现在检查您刚刚创建的 View 框架还为时过早。

一个 iOS 应用程序在一个“运行循环”中度过它的时间,看起来像这样:

while (1) {
Event phase: process one event (e.g. touch event, timer firing, local or push notification, etc.)
Layout phase: update the frames of new views and views with added or removed subviews
Draw phase: draw the contents of views that need to be drawn
Wait for the next event to arrive
}

当您将 View 添加到 View 层次结构时,它们会在布局阶段安排好布局。直到布局阶段完成后,您才能依靠新 View 来获得适当的框架。

您可以通过编写 UIView 的子类(或必要时任何其他 View 类的子类)并覆盖其 layoutSubviews 方法来进入布局阶段。或者您可以在 View Controller 中实现 viewDidLayoutSubviews 方法。我建议使用 UIView 子类并覆盖 layoutSubviews,但您可能会发现仅实现 viewDidLayoutSubviews 更方便:

- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self layoutWebView];
}

- (void)layoutWebView {
CGRect frame = self.view.bounds;
CGFloat navBarHeight = self.navigationBar.frame.size.height;
frame.origin.y = navBarHeight;
frame.size.height -= navBarHeight;
self.webView.frame = frame;
}

或者,如果您的部署目标是 iOS 6 或更高版本,您可以使用自动布局将导航栏的底部边缘固定到 WebView 的顶部边缘。把它放在 viewDidLoad 中:

[self.view addLayoutConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"|V:[_navigationBar][_webView]|"
options:0 metrics:nil
views:NSDictionaryOfVariableBindings(_navigationBar, _webView)]];

现在,我认为您的应用中具体发生的事情是您在创建 UINavigationBar 时将高度指定为 50,但是 UINavigationBar 需要高度44. 因此在布局阶段,导航栏将自身调整为 44 点高。由于您在布局期间没有做任何事情来修复 Web View 的框架,因此 Web View 仍然比顶级 View 的顶部边缘低 50 点,留下 6 点的差距。因此,您可以在创建导航栏时将导航栏的高度更改为 44。 ;^)

关于ios - 无法缩小 UIWebView 和 UINavigationBar 之间的差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com