小编ali*_*ego的帖子

如何在UILabel中使用UITextView检测并制作可点击链接

我正在构建一个聊天应用程序,出于性能原因,我需要使用UILabel而不是UITextView来显示聊天消息.我之前使用的是TextView,但滚动时的数据检测非常缓慢且不连贯.

问题是目前没有链接/电话/地址等... UILabels的检测.

如何知道字符串中存在链接或电话号码的位置,然后突出显示并使其在UILabel中可单击?

我已经阅读了很多关于如何为链接添加属性的文章,但是它们都是你知道范围或子串的链接.

我想获取任何字符串并找出是否包含链接以及这些链接的位置,然后将tapGestureRecognizer添加到标签并根据点击发生的位置执行操作.

我试图合并一个外部库(TTTAttributedLabel),但我正在使用swift,发现swift的文档有限.我确实设法导入库但是没有自动检测到链接.

uitextview uilabel datadetectortypes tttattributedlabel swift

9
推荐指数
1
解决办法
1万
查看次数

自定义inputAccessoryView作为UIView从nib给出错误:返回0宽度,假设UIViewNoIntrinsicMetric

我正在使用一个inputAccessoryView,它使用以下UIView子类从一个nib加载:

class CustomInputAccessoryView: UIView {

    @IBOutlet var containerView: UIView!
    @IBOutlet var contentView: UIView!
    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var textView: UITextView!        

    override var intrinsicContentSize: CGSize {
        return CGSize.zero
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupInputAccessoryView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupInputAccessoryView()
    }

    func setupInputAccessoryView() {
        self.translatesAutoresizingMaskIntoConstraints = false
        Bundle.main.loadNibNamed("CustomInputAccessoryView", owner: self, options: nil)
        addSubview(containerView)
        containerView.frame = self.bounds
    }

}
Run Code Online (Sandbox Code Playgroud)

我将视图分配给inputAccessoryView并通过以下方式设置它:

var customInputAccessoryView = CustomInputAccessoryView()
Run Code Online (Sandbox Code Playgroud)

inputAccessoryView正确加载并正确显示.问题是当我按下inputAccessoryView的textView并显示键盘时,我收到以下错误:

<_UIKBCompatInputView: ...; frame = …
Run Code Online (Sandbox Code Playgroud)

xcode xib ios inputaccessoryview swift

8
推荐指数
0
解决办法
374
查看次数

UITextView 可在 SwiftUI 中表示,不考虑 ScrollView 中的宽度界限

我想使用 SwiftUI 在 UITextView 中呈现文本。我正在使用 UIViewRepresentable 并在宽度超出滚动视图的边界时遇到问题。我希望是否将文本换行,但它只是在一根长线上继续,并且左侧和右侧不可见:

在此输入图像描述

这是我的代码:

struct ContentView: View {
    
    var messages = ["here is some long text to show the textView is not wrapping it's content"]
    
    var body: some View {
        GeometryReader { geometry in
            VStack(spacing: 0) {
                ScrollView(.vertical) {
                    ScrollViewReader { scrollView in
                        ZStack {
                            LazyVStack {
                                ForEach(messages, id: \.self) { message in
                                    TextView(text: message)
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

struct TextView: UIViewRepresentable {
    
    var text: String
     
    func makeUIView(context: Context) -> UITextView …
Run Code Online (Sandbox Code Playgroud)

xcode uitextview swift swiftui

7
推荐指数
1
解决办法
1083
查看次数

如何预览但不能编辑在iOS中使用UIImagePickerController选择的图像

希望有人可以帮助我.我正在使用imagePicker从iOS聊天应用中的照片库中选择图像.

我希望选择图像的行为模仿iMessage的行为.我遇到的具体问题是看到所选图像的预览.我希望看到此预览,并可以选择或取消,但不能编辑.

如果我设置imagePicker.allowsEditing = True,则会显示所选图像的预览,但我可以滚动和缩放它.我希望图像只是静态显示.

如果我设置imagePicker.allowsEditing = False,一旦从库中选择了图像,就会调用didFinishPickingMediaWithInfo而不预览图像.如果我然后在此方法中添加segue并设置我自己的视图,则无法返回到库,因为它已被解除.

基本上我只是想模仿从我的库中挑选图像的iMessage方式,并且希望在不使用自定义imagePicker的情况下这样做

谢谢

uiimagepickercontroller ios swift

6
推荐指数
0
解决办法
772
查看次数

当alertController(actionSheet)出现时,inputAccessoryView会动画

我有一个聊天应用程序的inputAccessoryView,它始终保持可见状态,并且停靠在屏幕底部,用于类似于大多数消息收发应用程序的文本输入。

当我呈现带actionSheet样式的alertController时,在呈现警报时,inputAccessoryView会在屏幕外动画,然后在解除警报时再次备份。这又会滚动我的tableView,这是不可取的。

之所以发生这种情况,是因为在显示警报时,聊天viewController放弃了firstResponder。

无论如何,当它的视图resignsFirstResponder出现时,是否要呈现一个alertController而不放弃firstResponder,还是将inputAccessoryView停靠在屏幕底部?

xcode ios inputaccessoryview swift uialertcontroller

6
推荐指数
1
解决办法
664
查看次数

无法使用Safari连接到AWS Cloud9 IDE

我正在尝试使用Cloud 9,但在部署IDE期间不断收到以下消息:

"Your web browser does not have third-party cookies enabled"
Run Code Online (Sandbox Code Playgroud)

我正在使用Safari 11.0.3并在首选项 - 隐私中阻止所有cookie框未选中.我可以使用Chrome但更喜欢使用Safari.

cookies safari cloud9-ide aws-cloud9

6
推荐指数
1
解决办法
1962
查看次数

减少 swift/iOS 中的视频大小以上传到服务器

我正在使用 UIImagePickerController 从我的 swift iOS 应用程序中选择一个视频。我正在保存此 URL,现在想将其转换为数据以使用以下方法发送到我的服务器进行存储:

let messageVideoData = NSData(contentsOfURL: chosenVideoURL)
Run Code Online (Sandbox Code Playgroud)

问题是文件大小非常大。对于在我的 iPhone 6s 上拍摄的 7 秒视频,分辨率为 1280、720,帧速率为 30,文件大小超过 4 MB。我注意到用 whatsapp 和其他聊天应用程序发送的相同图像减少到几百 KB。

减少外部存储文件大小的最佳方法是什么?该视频主要针对手机,因此将分辨率降低到 800 或更低就可以了。

我尝试将 UIImagePickerController 质量设置为:

picker.videoQuality = UIImagePickerControllerQualityType.Type640x480
Run Code Online (Sandbox Code Playgroud)

但这只会将文件大小减少到 3.5 MB。

使用:

picker.videoQuality = UIImagePickerControllerQualityType.TypeLow
Run Code Online (Sandbox Code Playgroud)

将分辨率降低到远低于所需的值。

我应该采取另一种方法来减少存储在服务器上的视频文件大小吗?

uiimagepickercontroller ios avasset swift

5
推荐指数
1
解决办法
1万
查看次数

当collectionView滚动时,如何使iOS collectionView的特定单元格淡出?

我想让我的UICollectionView的所有右侧单元格淡出,因为它们滚动类似于Apple的消息应用程序但不影响collectionView中其他单元格的颜色或透明度.有没有办法根据它的滚动位置调整UICollectionViewCell的透明度来实现这种效果?

transparency fade collectionview ios swift

5
推荐指数
3
解决办法
2642
查看次数

NSFetchedResultsController 中的 fetchBatchSize 和缓存被忽略

我正在使用 NSFetchedResultsController 在聊天室应用程序中显示消息。

上下文变量在 appDelegate 中分配,并引用聊天室中使用的上下文。

let context = persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)

我在 viewDidLoad 中初始化 NSFRC 如下:

func initializeResultsController() {
    let request = NSFetchRequest<Message>(entityName: "Message")
    let messageSort = NSSortDescriptor(key: "dateCreated", ascending: true)

    request.sortDescriptors = [messageSort]
    request.predicate = NSPredicate(format: "chatRoomId == %@", self.chatRoomId)
    request.fetchBatchSize = 30

    fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "messageDateSectionIdentifier", cacheName: self.chatRoomId)
    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
    } catch {
        fatalError("Failed to initialize FetchedResultsController: \(error)")
    }
}
Run Code Online (Sandbox Code Playgroud)

sectionNameKeyPath ("messageDateSectionIdentifier") 是一个派生属性,因此可以将这些部分划分为日历日。

我有两个问题。首先,batchSize 似乎被忽略,其次缓存似乎对性能没有影响。消息越多,选择聊天室的延迟时间越长。1500 条消息约 1 秒。

当我编辑方案以在控制台中显示 coreData …

xcode core-data nsfetchedresultscontroller ios swift

5
推荐指数
1
解决办法
503
查看次数

NSFetchRequest fetchBatchSize 不起作用

我在 NSFetchedResultsController 中遇到了 fetchBatchSize 问题,所以我决定退后一步,只在普通的 NSFetchRequest 上使用它。我创建了一个非常简单的项目,其中只有一个包含 100 个项目的 tableViewController。项目只有两个属性,itemID 和 itemName。我使用以下方法填充数据数组:

func initializeItems() {
        let request = NSFetchRequest<Item>(entityName: "Item")
        let messageSort = NSSortDescriptor(key: "itemName", ascending: true)
        request.sortDescriptors = [messageSort]
        request.fetchBatchSize = 20
        do {
            let fetchedResults = try context.fetch(request)
            if fetchedResults.count > 0 {
                self.items = fetchedResults
                //self.tableView.reloadData()
            }
        } catch {
            print("Could not fetch \(error)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

这在 tableViewController 的 viewDidLoad 中调用。上下文定义如下:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.context = appDelegate.persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,表格显示所有行都已完全填充(如滚动条所示)。

我不明白为什么 fetchBatchSize 被忽略了。

文档如下:

提取请求中指定的对象的批量大小。默认值为 0。批量大小为 …

xcode core-data nsfetchrequest ios swift

5
推荐指数
1
解决办法
617
查看次数