Swift-UITableView头部下拉放大

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift-UITableView头部下拉放大相关的知识,希望对你有一定的参考价值。

参考技术A UITableView头部下拉放大网上很多实现方式,使用过程会感觉很炫酷,实际实现起来成本确很低,两种实现方式供参考.

自定义UITableView,数据初始化:
<pre><code>` tableView = UITableView(frame: CGRect.init(x: 0, y: 64, width:self.view.bounds.width, height: self.view.bounds.height - 64), style: .plain)
tableView?.register(UITableViewCell.classForCoder(), forCellReuseIdentifier: "UITableViewCell")
tableView?.delegate = self
tableView?.dataSource = self

顶部头部设置:
<pre><code> let frame:CGRect = CGRect(x: 0, y: -200, width: self.view.bounds.width, height: 200) headerImgView = UIImageView.init(image: UIImage.init(named: "Header.jpeg")) headerImgView.frame = frame headerImgView.contentMode = .scaleAspectFill tableView?.contentInset = UIEdgeInsetsMake(200, 0, 0, 0) tableView?.addSubview(headerImgView) </code></pre>

实现UIScrollViewDelegate:
<pre><code>` func scrollViewDidScroll(_ scrollView: UIScrollView)
let offsetY:CGFloat = scrollView.contentOffset.y

实现效果下拉放大效果能实现,UITableView向上互动会有瑕疵,效果如下:

初始化数据不变,自定UITableHeaderView,添加子视图UIImageView
<pre><code>` func setUpTableHeader()
let frame:CGRect = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 200)

UIScrollViewDelegate中下拉过程需要对视图进行等比例放大及平移,停止下来的时候置为初始状态:
<pre><code>` func scrollViewDidScroll(_ scrollView: UIScrollView)
let offsetY:CGFloat = scrollView.contentOffset.y

`</code></pre>

效果图如下:

Bootstrap 3:如何在导航栏中使下拉链接的头部可点击

【中文标题】Bootstrap 3:如何在导航栏中使下拉链接的头部可点击【英文标题】:Bootstrap 3: how to make head of dropdown link clickable in navbar 【发布时间】:2013-11-24 23:22:36 【问题描述】:

我使用的是默认导航栏,其中一些列表项是下拉菜单。我无法单击触发下拉菜单的链接。我知道我可以在下拉列表中添加一个重复的链接,但我不想这样做。是否可以使头部链接成为可点击的链接(而不仅仅是下拉菜单的句柄)?

有关参考,请参阅下面下拉列表中的第一个链接。我希望用户能够单击它并实际转到它指向的页面。

<nav class="navbar navbar-fixed-top admin-menu" role="navigation">
  <div class="navbar-header">...</div>
   <!-- Collect the nav links, forms, and other content for toggling -->
   <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
     <ul class="nav navbar-nav navbar-right">
       <li class="dropdown">
         <a class="dropdown-toggle" data-toggle="dropdown" href="#">
           I DONT WORK! <b class="caret"></b>
         </a>
         <ul class="dropdown-menu">
           <li><a href="/page2">Page2</a></li>
         </ul>
       </li>
       <li><a href="#">I DO WORK</a></li>
     </ul>               
   </div><!-- /.navbar-collapse -->
 </nav>

【问题讨论】:

有机会获得 jsfiddle.net 吗? 你不需要修改默认的下拉代码吗?默认行为是下拉将在点击时自己显示。 点击下拉菜单时,为什么要同时导航到一个页面并向下滑动菜单?显示下拉菜单的目的将毫无用处,因为用户将进入新页面。我错过了什么吗? @Win 我想我希望下拉菜单在悬停时显示,但链接会在点击时发生。 @Emerson 请看我的回答。 【参考方案1】:

这是在悬停时向下滑动子菜单的代码,如果你点击它会让你重定向到一个页面。

如何:从标签中去掉class="dropdown-toggle" data-toggle="dropdown",并添加css。

这是jsfiddle 的演示。 对于演示,请调整 jsfiddle 的拆分器以查看由于 Bootstrap CSS 而导致的下拉列表。 jsfiddle 不会让您重定向到新页面

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
    <script type='text/javascript' src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type='text/javascript' src="http://netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
    <style type='text/css'>
        ul.nav li.dropdown:hover ul.dropdown-menu 
            display: block;
        
    </style>
</head>
<body>
    <nav class="navbar navbar-fixed-top admin-menu" role="navigation">
        <div class="navbar-header">...</div>
        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <li class="dropdown"><a href="http://***.com/">Stack Overflow <b class="caret"></b></a>

                    <ul class="dropdown-menu">
                        <li><a href="/page2">Page2</a>
                        </li>
                    </ul>
                </li>
                <li><a href="#">I DO WORK</a>
                </li>
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </nav>
</body>
</html>

【讨论】:

这是我今天早上试图解决的问题的一个很好的部分解决方案,所以谢谢。我唯一的问题是您如何考虑访问者在触摸屏设备上的可用性?您可以添加一个媒体查询以使悬停在下方剪切,例如 992 像素,但随后您会丢失触摸屏上的子菜单。我很想听听这方面的任何进一步的想法! 小提琴似乎什么也没做 @MattWilko 它使用引导程序,因此您需要调整拆分器最大化浏览器才能看到下拉菜单。 @Mkey 它使用 Bootstrap 响应式设计。因此,如果您在小浏览器窗口中打开,您只会看到.... 您必须在全屏浏览器中打开。为了更清晰,我用动画 GIF 替换了屏幕截图。【参考方案2】:

1:删除下拉触发器:

data-toggle="dropdown"

2: 添加你的 CSS

.dropdown:hover .dropdown-menu 
    display: block;

.dropdown-menu 
    margin-top: 0px;

为人们发布如何偶然发现这个

【讨论】:

老兄……太棒了!【参考方案3】:

我知道这有点老了,但我最近在寻找类似的解决方案时遇到了这个问题。依赖悬停事件不利于响应式设计,在移动/触摸屏上尤其糟糕。我最终对 dropdown.js 文件进行了小修改,允许您单击菜单项以打开菜单,如果再次单击菜单项,它将跟随它。

这样做的好处是它根本不依赖悬停,因此它在触摸屏上仍然可以很好地工作。

我已经在这里发布了:https://github.com/mrhanlon/twbs-dropdown-doubletap/blob/master/js/dropdown-doubletap.js

希望有帮助!

【讨论】:

这是迄今为止最好的方法。谢谢你这样做,我正要做同样的事情,你让我免于重新发明***! 很可能 bootstrap 自己的dropdown.js 在 2 年多的时间里已经发生了足够大的分歧,以至于这个版本不再适用。上面链接的版本适用于 bootstrap v3.3.5。看起来 3.3.6 中的事件发生了一些变化,我还没有针对那个版本进行测试。此外,它肯定不会在 4.x 中工作。 通常你会在移动设备大小的设备上禁用悬停功能的脚本,所以悬停确实不是一个坏主意,只要确保在分辨率为移动设备大小时改变悬停。 很高兴您提出了跨设备行为问题。恕我直言,双击应该只在移动设备上有效,否则悬停是显示的方式并单击要走的路,你不觉得吗?【参考方案4】:

任何想要快速解决这个问题的人来到这里。将 bootstrap.js(或 dropdown.js)中的“Dropdown.prototype.toggle”函数替换为以下内容:

  Dropdown.prototype.toggle = function (e) 
var $this = $(this)

if ($this.is('.disabled, :disabled')) return

var $parent  = getParent($this)
var isActive = $parent.hasClass('open')

clearMenus()

if (!isActive) 
    if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) 
        // if mobile we use a backdrop because click events don't delegate
        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
    

    var relatedTarget =  relatedTarget: this 
    $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

    if (e.isDefaultPrevented()) return

    $parent
      .toggleClass('open')
      .trigger('shown.bs.dropdown', relatedTarget)

    $this.focus()

else

    var href = $this.attr("href").trim();

    if (href != undefined && href != " javascript:;")
        window.location.href = href;


return false
  

在第二次单击时(即:如果菜单项具有“open”类),它将首先检查 href 是否未定义或设置为“javascript:;”在送你前行之前。

享受吧!

【讨论】:

【参考方案5】:

这会在打开下拉菜单的***菜单中启用链接,并在关闭时禁用它,唯一的缺点显然是必须在下拉菜单之外“点击”两次才能在移动设备中将其关闭。

$(document).on("page:load", function()
    $('body').on('show.bs.dropdown', function (e) 
        $(e.relatedTarget).addClass('disabled')
    );
    $('body').on('hide.bs.dropdown', function (e) 
        $(e.relatedTarget).removeClass('disabled')
    );
);

注意这假定了“标准”标记和 Turbolinks (Rails)。你可以试试 $(document).ready(...)

【讨论】:

【参考方案6】:

我知道为时已晚,但任何来这里寻求帮助的人现在都可以看到这篇文章。有两个选项使用 css/JavaScript,如果你使用 css,它将适用于宽度大于 769 像素的可点击顶部菜单的设备,这将是完美的工作f

See here 获取文章

【讨论】:

【参考方案7】:

这是一个基于 Bootstrap 3.3 使用一点 jQuery 的小技巧。

单击打开的下拉菜单会执行链接。

$('li.dropdown').on('click', function() 
    var $el = $(this);
    if ($el.hasClass('open')) 
        var $a = $el.children('a.dropdown-toggle');
        if ($a.length && $a.attr('href')) 
            location.href = $a.attr('href');
        
    
);

【讨论】:

谢谢! 非常简单易行的解决方案。我进行了一些更改,以便在再次单击时只有下拉列表的头部将充当链接(不是下拉列表的显示部分,如下拉列表的分隔符和非链接部分)。而不是$('li.dropdown')$(this);,我使用$('li.dropdown :first-child')$(this).parent();。这样,点击只适用于下拉列表的头部(第一个子元素),但$el 变量仍然引用整个下拉列表(li 元素)。 这应该被标记为保持 Bootstrap 菜单功能不变的最佳答案,并通过 javascript 增强功能使父链接可点击。 我已经使用 garfyid 的方法好几年了,但最近它开始出现问题,点击任何下拉菜单都会重新定位到头部项目 URL。添加 ADTC 的修改为我修复了它。 这是我见过的最好的解决方案。必须相应标记!!【参考方案8】:

只需在锚点上添加课程disabled

<a class="dropdown-toggle disabled" href="your link">
Dropdown</a>

你可以走了。

【讨论】:

太棒了!最佳解决方案! 我需要的修复和完美的解释。 “.disabled”意味着“继续工作但重新启用锚点”似乎不合逻辑XD 这只是没有意义,但确实有效,哈哈哈。 刚刚意识到它根本不适合移动设备:(【参考方案9】:

在你的anchor中添加disabled类,下面是js:

$('.navbar .dropdown-toggle').hover(function() 
  $(this).addClass('disabled');
);

但这对移动设备不友好,因此您需要为移动设备删除 disabled 类,因此更新的 js 代码如下:

$('.navbar .dropdown-toggle').hover(function() 
  if (document.documentElement.clientWidth > 769)  $(this).addClass('disabled');
  else  $(this).removeClass('disabled'); 
);

【讨论】:

【参考方案10】:

无需使用附加 CSS/JS(已测试)

    data-toggle="dropdown" - 用于可点击(可以使用移动设备和网络) data-hover="dropdown" - 用于悬停(仅限网页,因为移动设备没有HOVER 功能)

Works fine on Mobile as well :)


可点击的代码示例(data-toggle="dropdown")

/*!
 * this CSS code just  for snippet preview purpose. Please omit when using  it. 
 */

#bs-example-navbar-collapse-1 ul li 
  float: left;


#bs-example-navbar-collapse-1 ul li ul li 
  float: none !important;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<div id="bs-example-navbar-collapse-1">
  <ul class="nav navbar-nav">
    <li>
      <a class="" href="">Home</a>
    </li>
    <li class="dropdown">
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                subnav1
            </a>
      <ul class="dropdown-menu">
        <li><a href="">Sub1</a></li>
        <li><a href="">Sub2</a></li>
        <li><a href="">Sub3</a></li>
        <li><a href="">Sub4</a></li>
        <li><a href="">Sub5</a></li>
        <li><a href="">Sub6</a></li>
      </ul>
      <div class="clear"></div>
    </li>
    <li class="dropdown">
      <a href="" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true">
            subnav2
            </a>
      <ul class="dropdown-menu">
        <li><a href="">Sub1</a></li>
        <li><a href="">Sub2</a></li>
        <li><a href="">Sub3</a></li>
        <li><a href="">Sub4</a></li>
        <li><a href="">Sub5</a></li>
        <li><a href="">Sub6</a></li>
      </ul>
      <div class="clear"></div>
    </li>
  </ul>
</div>

<br>
<br>
<p><b>Please Note:</b> added css code not related to Bootstrap navigation. It's just for snippet preview purpose </p>

输出

【讨论】:

@JGEstevez 你说的不工作是什么意思?在移动 ?还是电脑?? 我不认为这是被问到的。我的理解是下拉菜单的标题应该是可点击的并且有自己的链接。因此,在您的示例中 subnav1 应该有一个插入符号来打开下拉列表,并且在单击 subnav1 时应该打开另一个链接,而不是下拉列表。【参考方案11】:

上述大多数解决方案都不适合移动设备。

我提出的解决方案检测它是否不是触摸设备并且navbar-toggle(汉堡菜单)不可见并使父菜单项在悬停时显示子菜单跟随点击链接

也使 tne margin-top 0 因为导航栏和某些浏览器中的菜单之间的间隙不允许您将鼠标悬停在子项上

$(function()
    function is_touch_device() 
        return 'ontouchstart' in window        // works on most browsers 
        || navigator.maxTouchPoints;       // works on IE10/11 and Surface
    ;

    if(!is_touch_device() && $('.navbar-toggle:hidden'))
      $('.dropdown-menu', this).css('margin-top',0);
      $('.dropdown').hover(function() 
          $('.dropdown-toggle', this).trigger('click').toggleClass("disabled"); 
      );			
    
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

$(function()
  $("#nav .dropdown").hover(
    function() 
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
      $(this).toggleClass('open');
    ,
    function() 
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
      $(this).toggleClass('open');
    );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

【讨论】:

【参考方案12】:

另外,这里有一个简单的 jQuery 解决方案:

$('#menu-main > li > .dropdown-toggle').click(function () 
    window.location = $(this).attr('href');
);

【讨论】:

【参考方案13】:

这是我的解决方案,它在您的标题中使用 JQuery,并且适用于移动设备。

在移动设备上,顶部链接需要点按两次:一次用于下拉菜单,一次用于转到其链接。

$(function()
  $('.dropdown-toggle').click(
    function()
      if ($(this).next().is(':visible')) 
        location.href = $(this).attr('href');;
      
     );
  );
);

【讨论】:

完美解决方案【参考方案14】:

这在我的情况下有效:

$('a[data-toggle="dropdown"]').on('click', function() 

    var $el = $(this);

    if ( $el.is(':hover') ) 

        if ( $el.length && $el.attr('href') ) 
            location.href =$el.attr('href');
        

    

);

【讨论】:

【参考方案15】:

这 100% 有效:

HTML:

<li class="dropdown">
          <a href="https://www.bkweb.co.in/" class="dropdown-toggle" >bkWeb.co.in Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>

CSS:

@media (min-width:991px)
  ul.nav li.dropdown:hover ul.dropdown-menu 
    display: block;
  

EXAMPLE in CODEPEN

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。【参考方案16】:

这个话题太老了,但我需要一个适用于桌面和移动设备的解决方案,但这些似乎都不适合我。不幸的是,这是我想出的解决方案,它涉及检查窗口宽度并将其与移动菜单断点进行比较:

$( 'a.dropdown-toggle' ).on( 'click', function( e ) 
    var $a = $( this ),
        $parent = $a.parent( 'li' ),
        mobile_bp = 767, // Default breakpoint, may need to change this.
        window_width = $( window ).width(),
        is_mobile = window_width <= mobile_bp;

    if ( is_mobile && ! $parent.hasClass( 'open' ) ) 
        e.preventDefault();
        return false;
    

    location.href = $a.attr( 'href' );
    return true;
);

【讨论】:

以上是关于Swift-UITableView头部下拉放大的主要内容,如果未能解决你的问题,请参考以下文章

浅谈个人主页头部下拉变大的思路

Android自定义View之上拉下拉列表 头部元素跟随 缩放平移效果的实现

Mint UI 之loadmore组件的坑:内部元素头部被遮挡了一部分

swift-UITableView

pychram 通过滚轮放大和缩小字体以及在头部添加注释

[转载]设置UITableVIew头部图片可拉伸放大的方法。