tableViewHeader中的iOS 11搜索栏会在焦点上跳转到屏幕顶部

时间:2017-09-26 07:24:29

标签: ios objective-c uitableview uisearchbar uisearchcontroller

此主题herehere上已有2个未答复的帖子,其中没有人提供此问题的有效解决方案。

第一张图片显示了搜索控制器的iOS 10行为,您可以在其中看到左侧的层次结构,右侧的搜索控制器框架以红色框起。在中心以蓝色查看是在表格中正确显示的。 This is iOS 10 behaviour of search controller

第二张图显示了iOS 11的行为,其中搜索控制器退出tableView标题的边界,并移动到屏幕顶部没有任何意义,因为表格视图位于距离顶部230像素的位置屏幕。 This is iOS 11 behaviour

我用来显示所有这些的代码如下(在viewDidLoad中):

self.definesPresentationContext = YES;
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
self.searchController.searchBar.clipsToBounds = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.searchBar.placeholder = @"Enter name or email";
[self.searchController.searchBar sizeToFit];

3 个答案:

答案 0 :(得分:3)

自iOS11以来,搜索控件是导航栏的一部分。您需要以下内容

<强>目标C //Adapter public class MapAdapter extends XmlAdapter<List<ProtocolBase>,Map<String,ProtocolBase>>{ @Override public List<ProtocolBase> marshal(Map<String,ProtocolBase> map){ return new ArrayList<ProtocolBase>(map.values()); } @Override public Map<String,ProtocolBase> unmarshal(List<ProtocolBase> lst){ Map<String,ProtocolBase> map = new HashMap<>(); for(ProtocolBase p : lst){ map.put(p.getClass().getSimpleName(),p); } return map; } } //Base Class @XmlAccessorType(XmlAccessType.FIELD) @XmlSeeAlso({ArrayList.class,Protocol1.class}) public class ProtocolBase { public ProtocolBase() { // TODO Auto-generated constructor stub } } //Derived class @JsonRootName( "Protocol1") @XmlAccessorType(XmlAccessType.FIELD) public class Protocol1 extends ProtocolBase{ @XmlAttribute(name="Name") @JsonProperty("Name") private String _name; } @JsonRootName( "Protocol2") @XmlAccessorType(XmlAccessType.FIELD) public class Protocol2 extends ProtocolBase{ @XmlAttribute(name="Name") @JsonProperty("Name") private String _name; } //Main class @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Data") @JsonRootName("Data") @XmlSeeAlso({ArrayList.class,Protocol1.class,ProtocolBase.class}) public class Data { @XmlJavaTypeAdapter(MapAdapter.class) @XmlElements({ @XmlElement(name="Protocol1",type=Protocol1.class) }) private Map<String,ProtocolBase> protocolList = new HashMap<String, ProtocolBase>(); } // Usage device = new Data(); Protocol1 p1 = new Protocol1(); p1.set_name("ADT"); Protocol2 p2 = new Protocol2(); p2.set_name("ADT1"); device.getProtocolList().put("Protocol1",(SSDeviceProtocol) p1); device.getProtocolList().put("Protocol2",(SSDeviceProtocol) p2); JAXBContext jc = (JAXBContext) JAXBContext.newInstance(); Marshaller m = jc.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(device, System.out); //Expected output <Data> <Protocol1 Name="ADT"/> <Protocol2 Name="ADT1"/> </Data>

<强>夫特


if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = searchController
} else {
    self.tableView.tableHeaderView = searchController.searchBar
}

答案 1 :(得分:0)

以下是来自故事板的视图控制器中tableView的约束。

 var tableConstraints: [NSLayoutConstraint]  {
            var constraints = [NSLayoutConstraint]()
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .left, relatedBy: .equal,
                                                  toItem: self.view, attribute: .left, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .right, relatedBy: .equal,
                                                  toItem: self.view, attribute: .right, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .top, relatedBy: .equal,
                                                  toItem: self.view, attribute: .top, multiplier: 1.0, constant: 1.0))
            constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .bottom, relatedBy: .equal,
                                                  toItem: self.view, attribute: .bottom, multiplier: 1.0, constant: 1.0))
            return constraints
        }

现在添加搜索栏并像这样添加此约束

  let search = UISearchController(searchResultsController: nil)
            search.searchResultsUpdater = self
            self.navigationItem.searchController = search
            NSLayoutConstraint.activate(tableConstraints) // important

并检查,向上和向下滚动时不跳跃。

答案 2 :(得分:0)

尝试使用

searchController.hidesNavigationBarDuringPresentation = NO;

结果会让您感到惊讶!