主頁 > 移動端開發 > Swift5 踩過的坑和奇怪的API筆記

Swift5 踩過的坑和奇怪的API筆記

2021-08-21 08:33:01 移動端開發

踩過的坑和奇怪的API筆記

    • UINavigationController 導航欄
          • 設定導航欄顏色
          • 去掉導航欄下面的分割線
          • 設定導航欄字體和字體顏色
    • UITabBar
          • UITabBar和導航欄結合使用
          • 獲取UITabBar的高度
          • 跳轉界面隱藏UITabBar的方案
    • UITableView
          • UITableViewCell里點擊事件不生效
          • 設定分割線內邊距
          • 隱藏所有分割線分割線
          • 隱藏底部多余行及分割線
    • UICollectionView & UIScrollView
          • cell里的按鈕區域只能點擊無法滑動
          • 允許多選
          • ScrollView是否顯示滑動條
          • ScrollView使ContentSize小于UIScrollView大小也能滑動
          • ScrollView分頁滑動
          • UIScrollView截長圖
    • UIView
          • 截圖
          • 拼接圖片
          • 獲取當前UIView的UIVIewController
    • UIImage
          • 重設圖片大小和等比例縮放
          • 裁切圖片
          • 獲取純色UIImage
          • 改變顏色
          • 獲取網路圖片
    • UIButton
          • UIButton中圖片和文字的位置變換
    • UIColor & Color
          • UIColor 十六進制
          • Color 十六進制
    • CGRect
          • CGRect等比例縮放
    • 點擊事件不生效可能的原因
    • Date
          • 獲取農歷日期
          • 當前月有多少天
          • 今天是今年第幾天
          • 本周是今年第幾周
    • String
          • sha256
          • unicode
          • urlEncoded
          • Base64
    • Dictionary
          • 合并字典
    • Application
          • 手機真實寬高(px)
          • 設計寬高
          • 手機序列號(唯一標識)
          • 手機別名:用戶定義的名稱
          • 設備名稱
          • 手機系統版本
          • 手機型號
          • 地方型號 (國際化區域名稱)
          • 是否是IPad

UINavigationController 導航欄

設定導航欄顏色
	navigationController?.navigationBar.barTintColor =  .blue
去掉導航欄下面的分割線
	navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
	navigationController?.navigationBar.shadowImage = UIImage()
  • 此時導航欄顏色和View背景相同,應該類似吧導航欄設定透明了的效果
  • 使用方法一設定導航欄顏色為.clear 并不能達到相同效果
  • 本方法會導致方法一設定導航欄顏色失效,此時使用以下代碼設定導航欄顏色
	navigationController?.navigationBar.backgroundColor = .orange
設定導航欄字體和字體顏色
	self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.black,NSAttributedString.Key.font : UIFont.systemFont(ofSize: 25)]


UITabBar

UITabBar和導航欄結合使用
	tabBarCtrl = UITabBarController()
    tabBarCtrl.tabBar.tintColor = .DesignGreen
    let view1 = ViewHome()
    view1.tabBarItem.image = UIImage(named: "xiaozujian")
    view1.tabBarItem.title = "組件"   
    let view2 = ViewIcon()
    view2.tabBarItem.image = UIImage(named: "tubiao")
    view2.tabBarItem.title = "圖示"

    let view1 = UINavigationController.init(rootViewController: viewHome)
    let view2 = UINavigationController.init(rootViewController: viewIcon)
    tabBarCtrl.addChild(view1)
    tabBarCtrl.addChild(view2)
    tabBarCtrl.selectedIndex = 0 //默認選擇
    self.window?.rootViewController = tabBarCtrl
    window?.makeKeyAndVisible()
獲取UITabBar的高度
let height = tabBarCtrl.tabBar.bounds.size.height
跳轉界面隱藏UITabBar的方案
	override func viewWillDisappear(_ animated: Bool) {
        tabBarCtrl.tabBar.isHidden = true
    }


UITableView

UITableViewCell里點擊事件不生效

使用 cell.contentView.addSubview 代替 cell.addSubview

設定分割線內邊距
	tableView.separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
隱藏所有分割線分割線
  • 方法一:
	self.separatorStyle = .none
  • 方法二:
	tableView.separatorInset = UIEdgeInsets(top: 0, left: tableView.frame.width, bottom: 0, right: 0)
隱藏底部多余行及分割線
	tableview.tableFooterView = UIView(frame: CGRect.zero)


UICollectionView & UIScrollView

cell里的按鈕區域只能點擊無法滑動
使用`UILabel`或`UIImageView`等系結`UITapGestureRecognizer`  代替`UIButton`
	func InitUI(){
		let img = UIImageView(frame:CGRect(xxxxxx))
	    let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(ClickBtn(_:)))
	    img.addGestureRecognizer(singleTapGesture)
	    img.isUserInteractionEnabled = true
    }
	@objc func ClickBtn(_ tap:UITapGestureRecognizer){
        
    }
允許多選
 	collection.allowsMultipleSelection = true
ScrollView是否顯示滑動條
	scrollView.showsHorizontalScrollIndicator = false
	scrollView.showsVerticalScrollIndicator = false
ScrollView使ContentSize小于UIScrollView大小也能滑動
   scrollView.alwaysBounceVertical = true
   scrollView.alwaysBounceHorizontal = true
ScrollView分頁滑動
	func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if (!decelerate)
        {
            scrollView.setContentOffset(CGPoint(x: CGFloat(Int(scrollView.contentOffset.x/pageWidth + 0.5))*pageWidth, y: scrollView.contentOffset.y), animated: true)
            selectPage = Int(scrollView.contentOffset.x/pageWidth + 0.5)
        }
    }
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        scrollView.setContentOffset(CGPoint(x: CGFloat(Int(scrollView.contentOffset.x/pageWidth + 0.5))*pageWidth, y: scrollView.contentOffset.y), animated: true)
        selectPage = Int(scrollView.contentOffset.x/pageWidth + 0.5)
    }
UIScrollView截長圖
///截長圖
	extension UIScrollView {
    /// 截長屏Image
    var captureLongImage: UIImage? {
        
        var image: UIImage? = nil
        let savedContentOffset:CGPoint? = contentOffset
        let savedFrame:CGRect? = frame
        
        contentOffset = .zero
        frame = CGRect(x: 0, y: 0,
                       width: contentSize.width,
                       height: contentSize.height)
        UIGraphicsBeginImageContextWithOptions(
            CGSize(width: frame.size.width,
                   height: frame.size.height),
            false,
            0.0)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        
        contentOffset = savedContentOffset ?? contentOffset
        frame = savedFrame ?? frame
        return image
        
    }
    
    fileprivate func writeImageToAlbum(_ image: UIImage) {
            
            UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
    }
        
    @objc fileprivate func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer) {
            if let _ = error as NSError? {
                print("保存失敗,請重試")
            } else {
                print("保存成功!")
            }
    }
    
}

UIView

截圖
	extension UIView {
    /// 截屏Image
    	func captureImage(size:CGSize)-> UIImage? {
        
	        // 引數①:截屏區域  引數②:是否透明  引數③:清晰度
	        UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0)
	        layer.render(in: UIGraphicsGetCurrentContext()!)
	        let image = UIGraphicsGetImageFromCurrentImageContext()
	        
	        UIGraphicsEndImageContext()
	        return image
	    }
	    
	     func captureImageInPos( rect: CGRect) -> UIImage? {
	      UIGraphicsBeginImageContext(rect.size)
	      guard let context = UIGraphicsGetCurrentContext() else { return nil }
	      context.translateBy(x: -rect.minX, y: -rect.minY)
	        self.draw(.zero)
	      let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
	      UIGraphicsEndImageContext()
	      return croppedImage
    	}
	}
拼接圖片
	//拼接圖片
	func combinTwoImage(image1:UIImage,image2:UIImage) -> UIImage
	{
	    let width = max(image1.size.width, image2.size.width)
	    let height = image1.size.height + image2.size.height
	    let offScreenSize = CGSize.init(width: width, height: height)
	    
	    
	    UIGraphicsBeginImageContextWithOptions(offScreenSize, false, 0.0)
	    let rect = CGRect.init(x:0, y:0, width:width, height:image1.size.height)
	    image1.draw(in: rect)
	    
	    let rect2 = CGRect.init(x:0, y:image1.size.height, width:width, height:image2.size.height)
	    image2.draw(in: rect2)
	    
	    let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
	    
	    UIGraphicsEndImageContext();
	    
	    return image;
	}
獲取當前UIView的UIVIewController
	extension UIView{
		func ParentCtrl()->UIViewController{
	       var vc:UIResponder = self
	       while vc.isKind(of: UIViewController.self) != true {
	           vc = vc.next!
	       }
	       return vc as! UIViewController
		}
	}


UIImage

重設圖片大小和等比例縮放
	extension UIImage {
	    /**
	     *  重設圖片大小
	     */
	    func  reSizeImage(reSize: CGSize )-> UIImage  {
	        //UIGraphicsBeginImageContext(reSize);
	        UIGraphicsBeginImageContextWithOptions (reSize, false , UIScreen .main.scale);
	        //繪制圖片
	        self.draw(in: CGRect(x: 0,
	                              y: 0,
	                              width: reSize.width,
	                              height: reSize.height))
	        let  reSizeImage: UIImage  =  UIGraphicsGetImageFromCurrentImageContext ()!
	        UIGraphicsEndImageContext ();
	        return  reSizeImage;
	    }
	    
	    /**
	     *  等比率縮放
	     */
	    func  scaleImage(scaleSize: CGFloat )-> UIImage  {
	        let  reSize = CGSize(width: self .size.width * scaleSize, height: self .size.height * scaleSize)  
	        return  reSizeImage(reSize: reSize)
	    }
    }
裁切圖片
	extension UIImage{
	    func crop(_ rect: CGRect) -> UIImage? {
	        let img = self.reSizeImage(reSize: UIScreen.main.currentMode!.size)
	        var newRect = rect
	        let WIDTH:CGFloat = UIScreen.main.bounds.width
			let RELWIDTH = UIScreen.main.currentMode?.size.width

	        let scale = (RELWIDTH!/WIDTH)
	        newRect.origin.x *=  scale*scale
	        newRect.origin.y *= scale*scale
	        newRect.size.width *= scale*scale
	        newRect.size.height *= scale*scale
	        
	        guard let imageRef = img.cgImage?.cropping(to: newRect) else { return nil }
	        return UIImage(cgImage: imageRef)
	    }
	}
獲取純色UIImage
	extension UIImage {
	    convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
	        let rect = CGRect(origin: .zero, size: size)
	        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
	        color.setFill()
	        UIRectFill(rect)
	        let image = UIGraphicsGetImageFromCurrentImageContext()
	        UIGraphicsEndImageContext()
	
	        guard let cgImage = image?.cgImage else { return nil }
	        self.init(cgImage: cgImage)
	    }
	}
改變顏色
	extension UIImage {
		func changeColor(color:UIColor) -> UIImage {
		           UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
		           let context = UIGraphicsGetCurrentContext()
		           context?.translateBy(x: 0, y: self.size.height)
		           context?.scaleBy(x: 1.0, y: -1.0)//kCGBlendModeNormal
		           context?.setBlendMode(.normal)
		           let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
		           context?.clip(to: rect, mask: self.cgImage!);
		           color.setFill()
		           context?.fill(rect)
		           let newImage = UIGraphicsGetImageFromCurrentImageContext()
		           UIGraphicsEndImageContext()
		           return newImage!
		       }
       }
獲取網路圖片
	func GetImgByUrl(path:String)->UIImage{
	    
	    let url = NSURL(string: path)!
	
	    let data = NSData(contentsOf: url as URL)!
	
	    return UIImage(data: data as Data,scale: 1.0)!
	}


UIButton

UIButton中圖片和文字的位置變換
	enum ButtonEdgeInsetsStyle {
	   case ButtonEdgeInsetsStyleTop // image在上,label在下
	   case ButtonEdgeInsetsStyleLeft  // image在左,label在右
	   case ButtonEdgeInsetsStyleBottom  // image在下,label在上
	   case ButtonEdgeInsetsStyleRight // image在右,label在左
	}
	extension UIButton {
	    func layoutButtonEdgeInsets(style:ButtonEdgeInsetsStyle,space:CGFloat) {
	        let labelWidth : CGFloat = self.titleLabel?.frame.size.height ?? 36
	        let labelHeight : CGFloat = self.titleLabel?.frame.size.width ?? 20
	        var imageEdgeInset = UIEdgeInsets.zero
	        var labelEdgeInset = UIEdgeInsets.zero
	      let imageWith = self.imageView?.frame.size.width
	      let imageHeight = self.imageView?.frame.size.height
	
	      switch style {
	      case .ButtonEdgeInsetsStyleTop:
	        imageEdgeInset = UIEdgeInsets(top: -labelHeight-space/2.0, left: (bounds.width - imageWith!)/2, bottom: 0, right: 0)
	        labelEdgeInset = UIEdgeInsets(top: 0, left: -imageWith!, bottom: -imageHeight!-space/2.0, right: 0)
	      case .ButtonEdgeInsetsStyleLeft:
	        imageEdgeInset = UIEdgeInsets(top: 0, left: -space/2.0, bottom: 0, right: space/2.0);
	        labelEdgeInset = UIEdgeInsets(top: 0, left: space/2.0, bottom: 0, right: -space/2.0);
	      case .ButtonEdgeInsetsStyleBottom:
	        imageEdgeInset = UIEdgeInsets(top: 0, left: 0, bottom: -labelHeight-space/2.0, right: -labelWidth)
	        labelEdgeInset = UIEdgeInsets(top: -imageHeight!-space/2.0, left: -imageWith!, bottom: 0, right: 0)
	      case .ButtonEdgeInsetsStyleRight:
	          // To Do print("坐標是====\(labelWidth)=====\(space)")
	        imageEdgeInset = UIEdgeInsets(top: 0, left: labelWidth+space/2.0, bottom: 0, right: -labelWidth-space/2.0)
	        labelEdgeInset = UIEdgeInsets(top: 0, left: -imageWith!-space/2.0, bottom: 0, right: imageWith!+space/2.0)
	      }
	      self.titleEdgeInsets = labelEdgeInset
	      self.imageEdgeInsets = imageEdgeInset
	  }
	}


UIColor & Color

UIColor 十六進制
	extension UIColor{
	    convenience init(hex: Int, alpha: CGFloat = 1){
	        let components = (
	            R: CGFloat((hex >> 16) & 0xff) / 255,
	            G: CGFloat((hex >> 08) & 0xff) / 255,
	            B: CGFloat((hex >> 00) & 0xff) / 255
	        )
	        self.init(
	            red: components.R,
	            green: components.G,
	            blue: components.B,
	            alpha: alpha
	        )
	        
	    }
    }
Color 十六進制
	extension Color {
	    init(hex: Int, alpha: Double = 1) {
	        let components = (
	            R: Double((hex >> 16) & 0xff) / 255,
	            G: Double((hex >> 08) & 0xff) / 255,
	            B: Double((hex >> 00) & 0xff) / 255
	        )
	        self.init(
	            .sRGB,
	            red: components.R,
	            green: components.G,
	            blue: components.B,
	            opacity: alpha
	        )
	    }
    }


CGRect

CGRect等比例縮放
	extension CGRect{  
	    init(x:CGFloat,y:CGFloat,w:CGFloat,h:CGFloat,scale:CGFloat){
	        self.init(x: x*scale, y: y*scale, width: w*scale, height: h*scale)
	    }
	}

點擊事件不生效可能的原因

  1. 部分控制元件默認用戶互動式關閉的,需要手動打開,UIView或父級View的isUserInteractionEnabled為false view.isUserInteractionEnabled = true
  2. 當前點擊的UIView或區域超出了父級View的范圍,
  3. 當前點擊的UIView或區域被其他透明View覆寫
  4. UITableViewCell里點擊事件不生效,使用 cell.contentView.addSubview 代替 cell.addSubview

Date

獲取農歷日期
	extension Date{
		static var ChineseDate: String{
		        //設定農歷日歷
		        let chinese = Calendar(identifier: .chinese)
		        let formatter = DateFormatter()
		        formatter.locale = Locale(identifier: "zh_CN")
		        formatter.calendar = chinese
		        //日期樣式
		        formatter.dateStyle = .long
		        //公歷轉為農歷
		        let str = formatter.string(from: Date())
		        return   String(str.dropFirst(4))
		    }
    }
當前月有多少天
	extension Date{
		static var DayCountOfMonth:Int{
	        
	        let ca = Calendar.init(identifier: .gregorian)
	        var lastMonthComps = DateComponents()
	        lastMonthComps.month = 0
	        let curDate = ca.date(byAdding: lastMonthComps, to: Date())
	        
	        var interval:Double = 0
	        var firstDate:Date = Date()
	        var lastDate :Date = Date()
	        
	        let calendar = NSCalendar.current
	        let bl = calendar.dateInterval(of: .month, start: &firstDate, interval: &interval, for: curDate!)
	        
	        if bl {
	            lastDate = firstDate.addingTimeInterval(interval-1)
	        }
	        let day = Calendar.current.component(.day, from: lastDate);
	        return day
	    }
	}
今天是今年第幾天
	extension Date{
		static var dayOfYear:Int{
		        let from = Calendar.current.dateComponents([.year], from: Date())
		        return (Calendar.current.dateComponents([.day], from: Calendar.current.date(from: from)!,to: Date()).day ?? 0) + 1  
		    }
	}
本周是今年第幾周
	extension Date{
		static var weekOfYear:Int{
	        return Calendar.current.component(.weekOfYear, from: Date())
	    }
	}

String

sha256
	extension String {
	    func sha256() -> String{
	        if let stringData = self.data(using: String.Encoding.utf8) {
	            return hexStringFromData(input: digest(input: stringData as NSData))
	        }
	        return ""
	        
	    }
	    
	    private  func hexStringFromData(input: NSData) -> String {
	        var bytes = [UInt8](repeating: 0, count: input.length)
	        input.getBytes(&bytes, length: input.length)
	        var hexString = ""
	        for byte in bytes {
	            hexString += String(format:"%02x", UInt8(byte))
	            
	        }
	        return hexString
	        
	    }
	    private func digest(input : NSData) -> NSData {
	        let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
	        var hash = [UInt8](repeating: 0, count: digestLength)
	        CC_SHA256(input.bytes, UInt32(input.length), &hash)
	        return NSData(bytes: hash, length: digestLength)
	        
	    }
	    
	}
unicode
	extension String {
	    var unicodeStr:String {
	        let tempStr1 = self.replacingOccurrences(of: "\\u", with: "\\U")
	        let tempStr2 = tempStr1.replacingOccurrences(of: "\"", with: "\\\"")
	        let tempStr3 = "\"".appending(tempStr2).appending("\"")
	        let tempData = tempStr3.data(using: String.Encoding.utf8)
	        var returnStr:String = ""
	        do {
	            returnStr = try PropertyListSerialization.propertyList(from: tempData!, options: [.mutableContainers], format: nil) as! String
	        } catch {
	            print(error)
	        }
	        return returnStr.replacingOccurrences(of: "\\r\\n", with: "\n")
	    }
	    
	    var unicode:String{
	        var str = ""
	        for scalar in self.unicodeScalars {
	            str = str + "\\u\(String(scalar.value, radix: 16))"
	        }
	        return str
	    }
	}
urlEncoded
	extension String {
	    //將原始的url編碼為合法的url
	    func urlEncoded() -> String {
	        let encodeUrlString = self.addingPercentEncoding(withAllowedCharacters:
	            .urlQueryAllowed)
	        return encodeUrlString ?? ""
	    }
	     
	    //將編碼后的url轉換回原始的url
	    func urlDecoded() -> String {
	        return self.removingPercentEncoding ?? ""
	    }
	}
Base64
	extension String {
	    //Base64編碼
	    func encodBase64() -> String?{
	        let strData = self.data(using: String.Encoding.utf8)
	        let base64String = strData?.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))
	        
	        return base64String
	    }
	    //Base64解碼
	    func decodeBase64() -> String?{
	        let decodedData = NSData(base64Encoded: self, options: NSData.Base64DecodingOptions.init(rawValue: 0))
	        let decodedString = NSString(data: decodedData! as Data, encoding: String.Encoding.utf8.rawValue) as String?
	        return decodedString
	    }
	}


Dictionary

合并字典
	extension Dictionary {
	    public func deepMerged(with other: [Key: Value]) -> [Key: Value] {
	        var result: [Key: Value] = self
	        for (key, value) in other {
	            if let value = value as? [Key: Value], let existing = result[key] as? [Key: Value] {
	                result[key] = (existing.deepMerged(with: value) as! Value)
	            } else {
	                result[key] = value
	            }
	        }
	        return result
	    }
	}

Application

手機真實寬高(px)

let RELWIDTH = UIScreen.main.currentMode?.size.width
let RELHEIGHT = UIScreen.main.currentMode?.size.height

設計寬高

let WIDTH:CGFloat = UIScreen.main.bounds.width let HEIGHT:CGFloat = UIScreen.main.bounds.height

手機序列號(唯一標識)

UIDevice.current.identifierForVendor?.uuidString

手機別名:用戶定義的名稱

UIDevice.current.name

設備名稱

UIDevice.current.systemName

手機系統版本

UIDevice.current.systemVersion

手機型號

UIDevice.current.model

地方型號 (國際化區域名稱)

UIDevice.current.localizedModel

是否是IPad

UIDevice.current.userInterfaceIdiom == .pad

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/295210.html

標籤:其他

上一篇:iOS開發 frame與bounds

下一篇:Android 開發多執行緒之換個視角理解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more