我正在构建一个聊天应用程序,出于性能原因,我需要使用UILabel而不是UITextView来显示聊天消息.我之前使用的是TextView,但滚动时的数据检测非常缓慢且不连贯.
问题是目前没有链接/电话/地址等... UILabels的检测.
如何知道字符串中存在链接或电话号码的位置,然后突出显示并使其在UILabel中可单击?
我已经阅读了很多关于如何为链接添加属性的文章,但是它们都是你知道范围或子串的链接.
我想获取任何字符串并找出是否包含链接以及这些链接的位置,然后将tapGestureRecognizer添加到标签并根据点击发生的位置执行操作.
我试图合并一个外部库(TTTAttributedLabel),但我正在使用swift,发现swift的文档有限.我确实设法导入库但是没有自动检测到链接.
uitextview uilabel datadetectortypes tttattributedlabel swift
我正在使用一个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) 我想使用 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) 希望有人可以帮助我.我正在使用imagePicker从iOS聊天应用中的照片库中选择图像.
我希望选择图像的行为模仿iMessage的行为.我遇到的具体问题是看到所选图像的预览.我希望看到此预览,并可以选择或取消,但不能编辑.
如果我设置imagePicker.allowsEditing = True,则会显示所选图像的预览,但我可以滚动和缩放它.我希望图像只是静态显示.
如果我设置imagePicker.allowsEditing = False,一旦从库中选择了图像,就会调用didFinishPickingMediaWithInfo而不预览图像.如果我然后在此方法中添加segue并设置我自己的视图,则无法返回到库,因为它已被解除.
基本上我只是想模仿从我的库中挑选图像的iMessage方式,并且希望在不使用自定义imagePicker的情况下这样做
谢谢
我有一个聊天应用程序的inputAccessoryView,它始终保持可见状态,并且停靠在屏幕底部,用于类似于大多数消息收发应用程序的文本输入。
当我呈现带actionSheet样式的alertController时,在呈现警报时,inputAccessoryView会在屏幕外动画,然后在解除警报时再次备份。这又会滚动我的tableView,这是不可取的。
之所以发生这种情况,是因为在显示警报时,聊天viewController放弃了firstResponder。
无论如何,当它的视图resignsFirstResponder出现时,是否要呈现一个alertController而不放弃firstResponder,还是将inputAccessoryView停靠在屏幕底部?
我正在尝试使用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.
我正在使用 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)
将分辨率降低到远低于所需的值。
我应该采取另一种方法来减少存储在服务器上的视频文件大小吗?
我想让我的UICollectionView的所有右侧单元格淡出,因为它们滚动类似于Apple的消息应用程序但不影响collectionView中其他单元格的颜色或透明度.有没有办法根据它的滚动位置调整UICollectionViewCell的透明度来实现这种效果?
我正在使用 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 …
我在 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。批量大小为 …
swift ×9
ios ×7
xcode ×5
core-data ×2
uitextview ×2
avasset ×1
aws-cloud9 ×1
cloud9-ide ×1
cookies ×1
fade ×1
safari ×1
swiftui ×1
transparency ×1
uilabel ×1
xib ×1