【问题标题】:How to right align text of UISearchbar in iOS7如何在 iOS7 中右对齐 UISearchbar 的文本
【发布时间】:2023-04-10 06:04:01
【问题描述】:

你能告诉我如何在 iOS 7 中右对齐 UISearchbar 文本吗? ,我在iOS6中使用它,但现在它在iOS7中不起作用:

//hacking search bar
UITextField *searchField;
for (UIView *subview in self.searchBar.subviews)
{

       if ([subview isKindOfClass:[UITextField class]]) {
        searchField = (UITextField *)subview;
        break;
    }
}
if (searchField) {
    searchField.textAlignment = NSTextAlignmentRight;
}

【问题讨论】:

    标签: ios iphone objective-c ios7


    【解决方案1】:

    不幸的是,如果不从头开始完全重新实现类,则无法安全地完成此操作,因为当用户开始和完成编辑时,对象代码的内部会调整文本对齐方式。

    与您想要做的最接近的事情是使用三个位置调整来水平移动文本,但这不会影响对齐,只会影响绝对位置,即使这样也只会在用户键入时影响。

    如果您想尝试此操作,请查找 searchTestPositionAdjustment、setPositionAdjustment:forSearchBarIcon: 和 searchFieldBackgroundPositionAdjustment。不过我认为它对你没有多大用处。

    -灰

    【讨论】:

      【解决方案2】:

      为时已晚,但如果有人仍然想知道解决方案,那么你可以按照这个。

      UITextField *searchTextField = [searchBarController.searchBar valueForKey:@"_searchField"];
      

      您可以使用上述代码获取搜索字段。现在只需使用您要使用的属性,例如。

      searchTextField.layer.cornerRadius = 10.0f;
      searchTextField.textAlignment = NSTextAlignmentRight;
      

      【讨论】:

        【解决方案3】:

        我有办法解决这个问题。这有点hacky,也不是很整洁,但它可以解决问题。

        由于UISearchBar 本身不允许您编辑占位符,因此我在其下方设置了一个UITextField 并通过以下操作禁用它:

        -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
        {
        
          if([touch.view isDescendantOfView:self.placeHolderTextField]){
            return NO;
          }
        
          return YES;
        }
        

        注意:不要忘记在 .h 文件中包含 <UIGestureRecognizerDelegate>。 但是,如果这不起作用,您可以随时使用[self.view sendSubViewToBack:self.placeholderTextField];

        接下来,我刚刚设置了要在哪些事件上显示占位符以及何时不显示占位符。 在viewDidLoad,我只是打电话给self.placeHolderTextFiew.placeholder = @"search"

        -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
        {
            if(searchText.length > 0){
              self.placeHolderTextfield.placeholder = @"";
            }  else{
               self.placeHolderTextfield.placeholder = @"search";
            }
        }
        

        再次注意:确保在您的 .h 文件中包含 <UISearchBarDelegate> 以使其正常工作。

        我也在使用tableView,所以当调用DidSelectRowAtIndexPath 方法时,我还将占位符设置为空字符串。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          你也可以这样试试.. searchbar.placeholder = @"嗨..空格";

          【讨论】:

          • 首先,这会将文本“Hai”推到左边,而不是右边。其次,您永远无法完全正确,因为“空格”字符的宽度超过一个像素。第三,您必须在用户键入时动态添加和删除空格,这将导致文本以难看的方式来回摆动。最后,它只会影响占位符文本。一旦用户开始在该字段中输入内容,文本就会自行左对齐。
          • 他要求右对齐而不是左对齐,占位符仅用于提示而不是真实文本。
          【解决方案5】:

          设置文本右对齐的方法

          搜索栏->属性检查器->搜索文本->自定义偏移量->水平(按要求设置)

          【讨论】:

            【解决方案6】:

            在玩了 UISearchBar 的子视图后,我发现了这个解决方案,它适用于 iOS 6 和 iOS 7

            //hacking search bar
            UITextField *searchField;
            for (UIView *subview in self.searchBar.subviews)
            {
            
                //this will work in iOS 7
                for (id sub in subview.subviews) {
                    if([NSStringFromClass([sub class]) isEqualToString:@"UISearchBarTextField"])
                    {
                        [sub setTextAlignment:NSTextAlignmentRight];
                    }
                }
                //this will work for less than iOS 7
                if ([subview isKindOfClass:[UITextField class]]) {
                    searchField = (UITextField *)subview;
                    break;
                }
            }
            //for less than iOS 7
            if (searchField) {
                searchField.textAlignment = NSTextAlignmentRight;
            }
            

            【讨论】:

            • 那是因为 UISearchBarTextField 不是搜索栏的直接子视图。您可以通过递归搜索类来检索它并设置其正确的文本对齐方式,但这是不好的做法。如果 Apple 再次更改类视图层次结构,它可能会中断。在任何情况下,它只会在输入文本时设置文本的对齐方式。占位符仍将居中,图标仍将左对齐。
            • 我在获取子视图之前递归地执行此操作,然后获取子视图的子视图,直到我到达 textView。但正如@Ash 所说,它将来可能会中断。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-21
            • 2016-07-24
            • 1970-01-01
            相关资源
            最近更新 更多