【Swift】iOS开发小坑历险记(二)

yeyouer 5年前
   <h2><strong>前言</strong></h2>    <p>这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇。 </p>    <h2>1、用动画更新约束没有动画效果?</h2>    <p>    缺少 layoutIfNeeded ,事例:</p>    <pre>  <code class="language-swift">        UIView.animateWithDuration(0.15, animations: { () -> Void in              self.heightConstraint.constant = 100              self.view.layoutIfNeeded()   // 这行不能少          })</code></pre>    <h2>2、处理单击和双击冲突</h2>    <p>    singleTapRecognizer.requireGestureRecognizerToFail( doubleTapRecognizer )</p>    <p>    但是有一个问题,单击响应会变慢,所以最好更改设计方案。</p>    <h2>3、获取 UILabel 的行数(不受 Lines 限制)</h2>    <pre>  <code class="language-swift">extension UILabel {        func lineCount() -> Int {          if let text = self.text {              let size = NSString(string: text).boundingRectWithSize(CGSizeMake(bounds.width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName : self.font], context: nil)              return Int(ceil(size.height / self.font.lineHeight))          }            return 0      }  }</code></pre>    <h2>4、自定义分享(分享到 非死book、推ter、Weibo)</h2>    <p>    本来不打算写,主要是搜索的时候没有很快搜到相关结果</p>    <pre>  <code class="language-swift">    func shareSocialAction(serviceType: String) {          let vc = SLComposeViewController(forServiceType: serviceType)          vc.setInitialText("欢迎来看直播")          vc.addImage(UIImage(named: "cover"))          vc.addURL(NSURL(string: "https://shou.tv/over140"))          presentViewController(vc, animated: true, completion: nil)      }</code></pre>    <p>    传入 SLServiceType推ter 就能分享到 推ter 了,查找一下定义就能看到分享到别,这里还有一个全的:<a href="/misc/goto?guid=4959634994807861320">OvershareKit</a></p>    <p>    注意:let vc = SLComposeViewController(forServiceType: serviceType) 可能会返回 nil ,需要加判断处理(网上有说国行的 iPhone 可能屏蔽掉了)。我这里的处理办法是走 推ter 和 非死book 的 SDK 发起分享。</p>    <h2>5、IQKeyboardManager 禁止某个 UITextField 的工具栏</h2>    <p>    针对 ViewController 级别禁用工具栏:IQKeyboardManager.sharedManager().disableToolbarInViewControllerClass ,如果这个 UITextField 直接 add 到 window 上的这个方法就不管用了,可以直接设置 inputAccessoryView = UIView() 即可。</p>    <h2>6、AFNetworking 3.0 输出 Log </h2>    <pre>  <code class="language-swift">let networkLogger = AFNetworkActivityLogger.sharedLogger()  networkLogger.startLogging()  let console = AFNetworkActivityConsoleLogger()  console.level = AFHTTPRequestLoggerLevel.AFLoggerLevelDebug  networkLogger.addLogger(console)</code></pre>    <h2>7、AVCaptureDevice.requestAccessForMediaType 授权失败弹 UIAlertView 需要放到 dispatch_async(dispatch_get_main_queue()) 主线上</h2>    <pre>  <code class="language-swift">AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: {[weak self](granted: Bool) in     if granted {        // 授权成功     } else {        // 授权失败,弹一个 UIAlertView        dispatch_async(dispatch_get_main_queue()) {           //UIAlertView....        }     }  })  </code></pre>    <p>如果不增加  dispatch_async(dispatch_get_main_queue())  这个代码,在部分设备上提示 UIAlertView 这行崩溃。</p>    <p> </p>    <p><strong>系列</strong></p>    <p>        <a href="http://www.open-open.com/lib/view/open1462181544561.html">【Swift】iOS开发小坑历险记(一)</a></p>    <p><strong>来源:</strong><a href="/misc/goto?guid=4959672201394835053">农民伯伯</a></p>