【问题标题】:Next/Previous Keyboard Toolbar iOS7下一个/上一个键盘工具栏 iOS7
【发布时间】:2013-09-28 22:42:44
【问题描述】:

目前,我正在尝试将键盘工具栏上的下一个/上一个按钮设置为新的、时尚的 iOS 7 后退按钮/前进按钮,这些按钮放在导航控制器中以返回。这是我正在尝试的。如何使用系统栏按钮项而不是枯燥的静态文本?

[self setToolbar:[[UIToolbar alloc] initWithFrame:self.frame]];
        [self.toolbar setBarStyle:UIBarStyleDefault];
        [self.toolbar setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth)];
        [self addSubview:self.toolbar];

        [self setSegmentedControl:[[UISegmentedControl alloc] initWithItems:@[ NSLocalizedStringFromTable(@"Previous", @"BSKeyboardControls", @"Previous button title."),
                                                                               NSLocalizedStringFromTable(@"Next", @"BSKeyboardControls", @"Next button title.") ]]];

这是现在的样子:

这是我想要的样子:

关于如何在不实际使用图像的情况下访问这些系统项目的任何想法?我知道它是确切的 iOS 7 后退栏按钮项目,我只是不知道如何在工具栏中访问它。我到处搜索。如果有帮助,我正在使用 BSKeyboardControls。

编辑:要使它看起来与第二张图像完全相同,请使用 Joshua 提供的图像,并将它们保存为 back@2x.png 和 forward@2x.png 到您的 xcode 项目中。使用 Chun 的代码,但确保调用获取图像的方法是这样的:imageNamed:@"back",而不是 @"back@2x"。您现在拥有 iOS 7 后退和前进按钮 :)

EDIT2:要使其看起来与下一个/上一个箭头按钮完全相同,请在正确的实现方法中使用以下自定义:

[self.segmentedControl setWidth:50 forSegmentAtIndex:0];
[self.segmentedControl setWidth:38 forSegmentAtIndex:1];

negativeSeparator.width = -19;

EDIT3:带有 箭头的工具栏默认出现在所有 UIWebViews 中,当您点击文本字段时它会出现。

如果有人对示例项目感兴趣,请告诉我,我会上传链接!

EDIT4:截至 2014 年 5 月 24 日,BSKeyboardControls 现在默认具有此功能。

【问题讨论】:

    标签: ios objective-c cocoa-touch ios7


    【解决方案1】:

    使用这个:https://github.com/simonbs/BSKeyboardControls

    但它使用了在 iOS 7 中扁平化的分段控件。

    编辑: 只需更改段的文本:

      [self setSegmentedControl:[[UISegmentedControl alloc] initWithItems:@[@"<",@">") ]]];
    

    这可能不是最优雅的。 (甚至不确定这个确切的代码是否可以编译,但你明白了)

    【讨论】:

    • 这就是我正在使用的。我只是好奇如何将分段控件更改为 符号。
    • 你的意思是,把BSKeyboard代码源上的文字改一下:
    • 不,我的意思是实际使用 iOS 7 箭头。就像导航项上的一样。
    【解决方案2】:

    这些是工具栏中使用的图像,例如后退和前进按钮图片:

    【讨论】:

    • 我假设这些是 x2?你也有 x1 吗?
    • @Arian 恐怕不行,你应该能够将它们缩小一半以提供相当不错的 1x 图像。
    【解决方案3】:

    使用 Joshua 共享的图标,然后尝试下面的代码,你会很高兴的。我这里没有添加完成按钮。

    UIImage *backImage = [[UIImage imageNamed:@"backImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIImage *forwardImage = [[UIImage imageNamed:@"forward"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[backImage, forwardImage]];
    [self.segmentedControl addTarget:self action:@selector(segmentedControlChangedState:) forControlEvents:UIControlEventValueChanged];
    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    self.segmentedControl.tintColor = [UIColor clearColor];
    UIBarButtonItem *aSegmentedControlBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl];
    [self setItems:@[aSegmentedControlBarButtonItem, self.flexibleSpace]];
    

    【讨论】:

    • segmentedControlChangedState: 的参数类型是什么? UISegmentedControl?
    • 是的。 - (void)segmentedControlChangedState:(UISegmentedControl *)iSender
    • segmentedControlStyle 已弃用,现在无效。
    【解决方案4】:

    您可以使用@iftekhar 提供的这个很棒的tool,并根据您提供图像的需要自定义IQSegmentedNextPrevious,而不是下一个上一个按钮。

    【讨论】:

      【解决方案5】:

      1) 从https://github.com/simonbs/BSKeyboardControls下载最新文件

      2) 导入后退/下一个按钮的图像。这些可以是您想要的任何东西,您可以设置适当的尺寸,使它们看起来不错。约书亚有一套很好的。我的保存为“keyboardBack.png”和“keyboardForward.png”

      3) 在 BSKeyboardControls.m 中,更新 initWithFields:fields。在这里,您可以进行一些自定义,例如设置后退/下一个按钮的宽度。我也删除了此处的“完成”按钮以跟随您的屏幕截图,但您可以将其添加回来。

      - (id)initWithFields:(NSArray *)fields
      {
          if (self = [super initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)])
          {
              // Creates toolbar
              [self setToolbar:[[UIToolbar alloc] initWithFrame:self.frame]];
              [self.toolbar setBarStyle:UIBarStyleDefault];
              [self.toolbar setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth)];
              [self addSubview:self.toolbar];
      
              // Import images
              UIImage *backImage = [[UIImage imageNamed:@"keyboardBack"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
              UIImage *forwardImage = [[UIImage imageNamed:@"keyboardForward"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      
              // Create segmentedcontrol
              self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[backImage, forwardImage]];
              self.segmentedControl.tintColor = [UIColor clearColor];
      
              // Set button widths
              [self.segmentedControl setWidth:50 forSegmentAtIndex:0];
              [self.segmentedControl setWidth:50 forSegmentAtIndex:1];
      
              // Other BSKeyboardControls stuff
              [self.segmentedControl addTarget:self action:@selector(segmentedControlValueChanged:) forControlEvents:UIControlEventValueChanged];
              [self.segmentedControl setMomentary:YES];
              [self.segmentedControl setEnabled:NO forSegmentAtIndex:BSKeyboardControlsDirectionPrevious];
              [self.segmentedControl setEnabled:NO forSegmentAtIndex:BSKeyboardControlsDirectionNext];
              [self setSegmentedControlItem:[[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl]];
              [self setVisibleControls:(BSKeyboardControlPreviousNext)];
              [self setFields:fields];
          }
      
          return self;
      }
      

      4) 工具栏左侧的内边距有点太多了,可以通过在toolbarItems: 中添加负号分隔符来解决这个问题:在BSKeyboardControls.m:

      - (NSArray *)toolbarItems
      {
          NSMutableArray *items = [NSMutableArray arrayWithCapacity:3];
          if (self.visibleControls & BSKeyboardControlPreviousNext)
          {
              UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                                 target:nil
                                                                                                 action:nil];
              negativeSeperator.width = -12;
      
              [items addObject:negativeSeperator];
              [items addObject:self.segmentedControlItem];
      
          }
      
          if (self.visibleControls & BSKeyboardControlDone)
          {
              [items addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]];
              [items addObject:self.doneButton];
          }
      
          return items;
      }
      

      注意:我可能没有确切规格的按钮宽度和填充,但您可以根据自己的喜好进行调整!

      【讨论】:

      • 精彩而深入的回答!做得好!如果你早点回答,我也会给你赏金!
      【解决方案6】:

      如果您不介意生活在边缘,您可以使用 Apple 未记录的系统项目来实现 iOS 7 的外观。这是左右栏按钮项。

          [self setDoneButton:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:nil action:nil]];
          [self setDoneButton:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:nil action:nil]];
      

      来源:http://iphonedevwiki.net/index.php/UIBarButtonItem

      【讨论】:

      • App Store 应用是否允许?
      • 正确答案是这样,因为苹果以自己的方式处理这种图像。我们应该坚持下去,以防止我们的应用在 ios 更新后看起来很荒谬。
      • 我怎样才能使用 Swift 完成这项工作?
      • 这在 Xcode 7.3/Swift 2.2 中不起作用:它不允许您在 initWithBarButtonSystemItem 参数中使用整数。
      【解决方案7】:

      使用 Xcode 7.3,您也可以只输入一个符号作为 Bar Item 的 title。这在代码和 Interface Builder 中都有效:

      • 将光标放在您希望符号出现的位置(例如,IB 中的title 框或代码中的引号内)。
      • 在 Xcode 的菜单中,单击编辑,然后单击表情符号和符号。 (或者,按 control-command-space 以调出字符列表。)
      • 在搜索框中,输入 lessgreater
      • 然后,选择您想要的符号。

      默认情况下,工具栏中的小于和大于符号显示为蓝色。

      在代码中:

      backButton.title = "<"
      

      在 IB 中:

      【讨论】:

        猜你喜欢
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多