在分割视图中的 UIToolbar 上将文本注释完全居中

发布于 2024-11-01 15:37:32 字数 2283 浏览 6 评论 0原文

我在详细视图中创建了一个带有 UIToolbar 的分割视图。我添加了一个 UILabel 来放置标题文本。我使用了一些建议来构建它,但我注意到,在纵向模式下(当主视图的弹出按钮存在时),文本并不完全居中。它偏移了弹出按钮的宽度。我尝试减去弹出窗口的宽度,但灵活的垫片似乎将其放回去。我还尝试了 self.titleLabel 的各种宽度(例如 self.view.frame.size.width)。居中在横向模式下工作正常(因为没有弹出按钮)。有人以前看过这个并有建议吗?谢谢!

- (void)toolbarTitleWithNSString:(NSString *)titleString {
NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                        target:nil
                                                                        action:nil];
[items addObject:spacer];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0,
                                                            11.0f,
                                                            100.0f,
                                                            21.0f)];
[self.titleLabel setFont:[UIFont boldSystemFontOfSize:18.0]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setShadowColor:UIColorFromRGB(0xe5e7eb80)];
[self.titleLabel setShadowOffset:CGSizeMake(0, -1.0)];
[self.titleLabel setTextColor:UIColorFromRGB(0x717880ff)];
[self.titleLabel setText:titleString];
[self.titleLabel setTextAlignment:UITextAlignmentCenter];
UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[items addObject:spacer];
[spacer release];

[self.toolbar setItems:items animated:YES];
[items release];
}

#pragma mark -
#pragma mark Managing the popover

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
    // Add the popover button to the toolbar array.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray insertObject:barButtonItem atIndex:0];

    [toolbar setItems:itemsArray animated:NO];
    [itemsArray release];
}

- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
    // Remove the popover button from the toolbar array.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray removeObject:barButtonItem];
    [toolbar setItems:itemsArray animated:NO];
    [itemsArray release];
}

I have created a split view with a UIToolbar in the detail view. I've added a UILabel in order to place title text. I used some suggestions for building it, but I've noticed that when in portrait mode (when the master view's popover button is present), the text isn't quite centered. It's offset by the width of the popover button. I've tried subtracting the width of the popover out, but the flexible spacer seems to put it back in. I've also tried a variety of widths for self.titleLabel (such as self.view.frame.size.width). Centering works fine in landscape mode (as there's no popover button). Anyone see this before and have a suggestion? Thanks!

- (void)toolbarTitleWithNSString:(NSString *)titleString {
NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                        target:nil
                                                                        action:nil];
[items addObject:spacer];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0,
                                                            11.0f,
                                                            100.0f,
                                                            21.0f)];
[self.titleLabel setFont:[UIFont boldSystemFontOfSize:18.0]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setShadowColor:UIColorFromRGB(0xe5e7eb80)];
[self.titleLabel setShadowOffset:CGSizeMake(0, -1.0)];
[self.titleLabel setTextColor:UIColorFromRGB(0x717880ff)];
[self.titleLabel setText:titleString];
[self.titleLabel setTextAlignment:UITextAlignmentCenter];
UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[items addObject:spacer];
[spacer release];

[self.toolbar setItems:items animated:YES];
[items release];
}

#pragma mark -
#pragma mark Managing the popover

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
    // Add the popover button to the toolbar array.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray insertObject:barButtonItem atIndex:0];

    [toolbar setItems:itemsArray animated:NO];
    [itemsArray release];
}

- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
    // Remove the popover button from the toolbar array.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray removeObject:barButtonItem];
    [toolbar setItems:itemsArray animated:NO];
    [itemsArray release];
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

诗酒趁年少 2024-11-08 15:37:33

你可以试试这个,我不知道它是否有效。
检查 splitview 的委托方法

,最初您可以将标签的框架设置为纵向模式,然后当您将模式从横向更改为纵向时,将调用此方法

 - (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
    {
      // this time label's frame will be same as u write before when u init yr label at viewdidload or somewhr else
        [self.titleLabel setFrame:CGRectMake(x,y,sizex,sizey)];

    }

,但是当您将模式从纵向更改为横向时,将调用此方法,因此可以修改您的标签的框架该方法如下,

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
        [self.titleLabel setFrame:CGRectMake(x1,y1,sizex,sizey)];
}

You may try this i don't know weather it will work or not.
check splitview's delegate methods

initially u can set label's frame for portrait mode and then this method will called when u change yr mode from landscape to portrait

 - (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
    {
      // this time label's frame will be same as u write before when u init yr label at viewdidload or somewhr else
        [self.titleLabel setFrame:CGRectMake(x,y,sizex,sizey)];

    }

but when u change the mode from protrait to landscape this method will be called so may modify yr label's frame at this method as follows,

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
        [self.titleLabel setFrame:CGRectMake(x1,y1,sizex,sizey)];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文