Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义UISearchbar-iOS的UITextfield_Ios_Uitextfield_Uisearchbar_Quartz Core - Fatal编程技术网

自定义UISearchbar-iOS的UITextfield

自定义UISearchbar-iOS的UITextfield,ios,uitextfield,uisearchbar,quartz-core,Ios,Uitextfield,Uisearchbar,Quartz Core,我正在尝试为UISearchbar自定义文本字段。下图显示了我完成了一半的工作。 我对UISearchbar进行了子类化,并从视图控制器中调用了它。我正试图从文本字段中删除那些深灰色的线条。下面是添加到viewcontroller子视图的UISearchbar的实现 searchbar = [[SearchBar alloc] initWithFrame:CGRectMake(35,78, 250, 17)]; searchbar.backgroundColor = [UIColor clea

我正在尝试为UISearchbar自定义文本字段。下图显示了我完成了一半的工作。

我对UISearchbar进行了子类化,并从视图控制器中调用了它。我正试图从文本字段中删除那些深灰色的线条。下面是添加到viewcontroller子视图的UISearchbar的实现

searchbar = [[SearchBar alloc] initWithFrame:CGRectMake(35,78, 250, 17)];
searchbar.backgroundColor = [UIColor clearColor];
searchbar.layer.borderColor = [[UIColor clearColor] CGColor];
searchbar.layer.borderWidth = 0;

for(UIView *view in searchbar.subviews){
    if([view isKindOfClass:[UITextField class]]){
        UITextField *tf= (UITextField *)view;
        tf.layer.borderColor = [[UIColor clearColor] CGColor];
        tf.delegate = self;
        break;
    }
}
[self.view addSubview:searchbar];
searchbar.delegate = self;
UISearchBar子类:

   - (id)initWithFrame:(CGRect)frame
  {
   self = [super initWithFrame:frame];
if (self) {
      // Initialization code
     }
     return self;
}

-(void)layoutSubviews{
     UITextField *searchField;
     [[[self subviews] objectAtIndex:0] removeFromSuperview];
     [self setTintColor:[UIColor clearColor]];
     self.clipsToBounds = YES;
     NSUInteger numViews = [self.subviews count];
     for(int i = 0; i < numViews; i++) {
        if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { 
            searchField = [self.subviews objectAtIndex:i];
             searchField.leftViewMode = UITextFieldViewModeNever;
             searchField.backgroundColor = [UIColor clearColor];

        }


    }
    if(!(searchField == nil)) {            
        searchField.backgroundColor = [UIColor clearColor];
        searchField.textColor = [UIColor blackColor];
        searchField.frame = CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height-10);

        [searchField setBorderStyle:UITextBorderStyleRoundedRect];

    }

    [super layoutSubviews];

}
-(id)initWithFrame:(CGRect)frame
{
self=[super initWithFrame:frame];
如果(自我){
//初始化代码
}
回归自我;
}
-(无效)布局子视图{
UITextField*搜索字段;
[[self subviews]objectAtIndex:0]removeFromSuperview];
[self-setTintColor:[UIColor clearColor]];
self.clipstobunds=是;
NSU整数numViews=[self.subviews count];
for(int i=0;i
我正在努力实现这样的目标: 文本字段不应有任何边界。图标在ImageView中被展平


这是一种从UISearchBar子视图层次结构获取文本字段并根据需要设置其属性的简单方法,如

  UITextField *txfSearchField = [searchbar valueForKey:@"_searchField"];
[txfSearchField setBackgroundColor:[UIColor whiteColor]];
    [txfSearchField setLeftView:UITextFieldViewModeNever];
    [txfSearchField setBorderStyle:UITextBorderStyleRoundedRect];
    txfSearchField.layer.borderWidth = 8.0f; 
    txfSearchField.layer.cornerRadius = 10.0f;
        txfSearchField.layer.borderColor = [UIColor clearColor].CGColor;

从IOS-5开始,您拥有外观代理,请参见: (有两个部分称为“自定义外观”,请同时选中)

下面是一个工作示例,它修改了应用程序中的所有UISearchBar:

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"text_box"] forState:UIControlStateNormal];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"search_icon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
mysearchBar.tintColor = [UIColor whiteColor];

如果不想使用未记录的功能或图像,请使用以下选项:

CGSize size = CGSizeMake(30, 30);
// create context with transparent background
UIGraphicsBeginImageContextWithOptions(size, NO, 1);

// Add a clip before drawing anything, in the shape of an rounded rect
[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,30,30)
                            cornerRadius:2.0] addClip];
[[UIColor whiteColor] setFill];

UIRectFill(CGRectMake(0, 0, size.width, size.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal];

实现抗更改和高性能

extension UISearchBar {
    var textField:UITextField {
        guard let txtField = self.value(forKey: "_searchField") as? UITextField else {
            assertionFailure()
            return UITextField()
        }
        return txtField
    }
}
任何阅读本文并想知道如何在Swift中轻松访问搜索栏的文本字段的人;您可以使用下面的代码扩展UISearchBar以添加textField属性,这段代码可以抵抗底层实现更改,并缓存找到的结果,从而获得高性能

import UIKit

private var foundTextFieldAssociationKey = UInt8()

extension UISearchBar {

  var textField: UITextField {
    get {
      let value = objc_getAssociatedObject(self, &foundTextFieldAssociationKey) as? UITextField

      if value == nil {
        let findInView = (UIView) -> UITextField? = { view in
          for subview in view.subviews {
            if let textField = (subview as? UITextField) ?? findInView(subview) {
              return textField
            }
          }
          return nil
        }

        guard let foundTextField = findInView(self) else {
          fatalError("UISearchBar doesn't seem to have a UITextField anywhere in the view hierarchy")
        }

        textField = foundTextField
        return foundTextField
      }

      return value!
    }
    set {
      objc_setAssociatedObject(self, &foundTextFieldAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
    }
  }

}

如果要更改属性的名称,请确保不将其更改为searchField。这会把你的搜索栏弄得一团糟。

我发现iOS 10需要这样做(从上面借来,并快速调整)


简洁明了

extension UISearchBar {
    var textField:UITextField {
        guard let txtField = self.value(forKey: "_searchField") as? UITextField else {
            assertionFailure()
            return UITextField()
        }
        return txtField
    }
}

对于仍在寻找答案的用户,苹果在iOS 13的UISearchBar中添加了
searchTextField
属性
searchTextField
是从UITextField继承的

let searchBar = UISearchBar()
var searchField : UITextField
if #available(iOS 13.0, *) {
    searchField = searchBar.searchTextField
} else {
    searchField = //One of the other methods listed
}

现在,在iOS 13中,您可以使用
searchTextField
属性直接访问文本字段。

iOS 13.x和Swift 5.x

执行以下操作以访问
UISearchBar
中的
UITextField

extension UISearchBar {

    /// Returns the`UITextField` that is placed inside the text field.
    var textField: UITextField {
        if #available(iOS 13, *) {
            return searchTextField
        } else {
            return self.value(forKey: "_searchField") as! UITextField
        }
    }

}

如我所说,图标是UIImageview的一部分。我担心的是文本字段。那些深灰色的线条将被删除。谢谢你的回答。图标已经从搜索栏中删除。谢谢你,我会为你付啤酒费的。谢谢!我使用它更改了使用UITextField*txfSearchField=[\u searchBar valueForKey:@“\u searchField]”进行搜索的键盘;[TXSearchField setKeyboardType:UIKeyboardTypeNumberPad];它在iOS 13上崩溃在iOS 13中,您得到的SearchTextField是这样的:UITextField*search=searchBar.SearchTextField将self.valueForKey(“\u searchField”)返回为怎么样?UITextField
?@ton有效。我怀疑苹果会在不久的将来更改密钥,但在使用黑客解决方案时,我个人更喜欢找到一种对底层实现更改有点弹性的方法。@abishek bedi我将您的更改重新编辑了一遍。我的代码很旧,但您编辑了实现的核心,并将其完全更改为其他内容。我的实现的核心在于不依赖于_searchField来抵抗核心实现的变化。嘿,这是一个很好的解决方案。苹果用新的IDE捕捉到了这个私有API