- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
整个星期我都在尝试让 UITextView
调整大小。我看不出这应该如何完成,所以我决定包括几乎所有相关代码。
我有这个对话 View :
这个对话 View 是一个 UIViewController
,里面有一个 UITableView
(使用约束)。我有一个自定义的 UIView
子类 ConversationToolbar
设置为 inputAccessoryView
(包含它的 UIViewController
可以成为第一响应者,所以该 View 始终可见),其中包含 2 个 subview 。一个用于 UITextView
和左右按钮,一个用于表情符号。表情符号仅在点击左按钮时显示:
选择一个时,它以 float 标签显示:
当使用多行时,我现在无法调整此 UITextView
的大小。我曾尝试自己计算所有帧,但这似乎以某种奇怪的方式与我的约束相冲突。几乎总是 UITextView
要么太小,要么只有在我按下另一个键更新 View 后它才会调整大小。或者 UITextView
在键盘上方变大,或者在关闭键盘时滑出 View 。
我已经从我的代码中删除了所有调整大小的功能,我想知道我需要做什么才能进行此调整。
在我的 ConversationViewController
中:
var toolbar: ConversationToolbar!
override var inputAccessoryView: UIView! {
get {
if toolbar == nil {
toolbar = NSBundle.mainBundle().loadNibNamed("ConversationToolbar", owner: nil, options: nil).last! as ConversationToolbar
toolbar.frame.size = CGSize(width: UIScreen.mainScreen().bounds.size.width, height: 80)
toolbar.delegate = self
toolbar.setDraft(conversation.draft)
}
return toolbar
}
}
ConversationToolbar.xib
为:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" systemVersion="14D87p" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ConversationToolbar" customModule="Heaven_Help" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="s5O-PN-dtz">
<rect key="frame" x="0.0" y="554" width="600" height="46"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="749" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pbw-hg-sNn">
<rect key="frame" x="0.0" y="0.0" width="36" height="46"/>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="😶">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="emoPress:" destination="iN0-l3-epB" eventType="touchUpInside" id="hLw-rH-Hym"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Vid-Ac-jz3">
<rect key="frame" x="548" y="0.0" width="52" height="46"/>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="Send">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="sendPress:" destination="iN0-l3-epB" eventType="touchUpInside" id="rzU-Vk-nJa"/>
</connections>
</button>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Czv-f6-jOP">
<rect key="frame" x="36" y="8" width="512" height="30"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="46" id="D1D-QM-5n2"/>
<constraint firstAttribute="trailing" secondItem="Vid-Ac-jz3" secondAttribute="trailing" id="H9Y-xT-aqe"/>
<constraint firstAttribute="centerY" secondItem="pbw-hg-sNn" secondAttribute="centerY" id="IYf-5R-S97"/>
<constraint firstItem="Czv-f6-jOP" firstAttribute="leading" secondItem="pbw-hg-sNn" secondAttribute="trailing" id="LpH-ir-M9U"/>
<constraint firstAttribute="centerY" secondItem="Vid-Ac-jz3" secondAttribute="centerY" id="NQ1-m1-9rk"/>
<constraint firstAttribute="bottom" secondItem="Vid-Ac-jz3" secondAttribute="bottom" id="UUt-1r-emN"/>
<constraint firstItem="Czv-f6-jOP" firstAttribute="top" secondItem="s5O-PN-dtz" secondAttribute="top" constant="8" id="VWB-7N-LrK"/>
<constraint firstAttribute="bottom" secondItem="Czv-f6-jOP" secondAttribute="bottom" constant="8" id="WTi-8a-kaM"/>
<constraint firstItem="pbw-hg-sNn" firstAttribute="leading" secondItem="s5O-PN-dtz" secondAttribute="leading" id="a4Q-W4-ROh"/>
<constraint firstAttribute="bottom" secondItem="pbw-hg-sNn" secondAttribute="bottom" id="hGG-Xe-FZZ"/>
<constraint firstItem="Vid-Ac-jz3" firstAttribute="leading" secondItem="Czv-f6-jOP" secondAttribute="trailing" id="jc6-18-MYq"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rh6-cD-U1e">
<rect key="frame" x="0.0" y="508" width="600" height="46"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6zz-GF-eHs">
<rect key="frame" x="279" y="525" width="42" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerX" secondItem="6zz-GF-eHs" secondAttribute="centerX" id="3at-fx-ZCR"/>
<constraint firstAttribute="bottom" secondItem="s5O-PN-dtz" secondAttribute="bottom" id="3r5-GG-6Eo"/>
<constraint firstItem="s5O-PN-dtz" firstAttribute="height" secondItem="rh6-cD-U1e" secondAttribute="height" id="MBP-k2-Qre"/>
<constraint firstItem="s5O-PN-dtz" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="PLK-DE-38r"/>
<constraint firstItem="s5O-PN-dtz" firstAttribute="top" secondItem="6zz-GF-eHs" secondAttribute="bottom" constant="8" symbolic="YES" id="PRr-qQ-oyf"/>
<constraint firstAttribute="trailing" secondItem="s5O-PN-dtz" secondAttribute="trailing" id="PqA-VB-NxV"/>
<constraint firstItem="s5O-PN-dtz" firstAttribute="top" secondItem="rh6-cD-U1e" secondAttribute="bottom" id="ZxJ-8p-Mjq"/>
<constraint firstItem="rh6-cD-U1e" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="lsS-5I-Saq"/>
<constraint firstAttribute="trailing" secondItem="rh6-cD-U1e" secondAttribute="trailing" id="yRP-hS-dpr"/>
</constraints>
<connections>
<outlet property="emoButton" destination="pbw-hg-sNn" id="VJx-J0-hBJ"/>
<outlet property="emoLabel" destination="6zz-GF-eHs" id="pUW-yD-pIq"/>
<outlet property="emoView" destination="rh6-cD-U1e" id="0YV-Wx-clp"/>
<outlet property="sendButton" destination="Vid-Ac-jz3" id="6FV-Q2-ufA"/>
<outlet property="textSuperView" destination="s5O-PN-dtz" id="BIT-bH-p4M"/>
<outlet property="textView" destination="Czv-f6-jOP" id="syf-v4-LLy"/>
</connections>
</view>
</objects>
</document>
最后是我的 ConversationToolbar.swift
:
import Foundation
class ConversationToolbar: UIView, UITextViewDelegate {
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var emoView: UIView!
@IBOutlet weak var sendButton: UIButton!
@IBOutlet weak var textSuperView: UIView!
@IBOutlet weak var emoButton: UIButton!
@IBOutlet weak var emoLabel: UILabel!
var delegate: ConversationToolbarDelegate!
var emobuttons: [String: UIButton]!
var emoSelected: String?
var clickableSend: Bool {
get {
return ((delegate?.hasEnoughCredits() ?? false) && !(textView?.text?.isEmpty ?? true)) ?? false
}
}
override func awakeFromNib() {
textView.delegate = self
sendButton.enabled = clickableSend
self.autoresizingMask = .FlexibleHeight
// Make textView pretty
textView.backgroundColor = UIColor.whiteColor() // (white: 250/255, alpha: 1)
textView.font = UIFont.systemFontOfSize(17)
textView.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 205/255, alpha:1).CGColor
textView.layer.borderWidth = 0.5
textView.layer.cornerRadius = 5
textView.scrollsToTop = false
textView.textContainerInset = UIEdgeInsetsMake(4, 3, 3, 3)
textView.autoresizingMask = .FlexibleHeight
// Add a nice border to the view
textSuperView.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 205/255, alpha:1).CGColor
textSuperView.layer.borderWidth = 0.5
textSuperView.backgroundColor = UIColor(white: 235/255, alpha: 1)
textSuperView.autoresizingMask = .FlexibleHeight
// Prettify emoView
emoView.layer.borderColor = UIColor(red: 200/255, green: 200/255, blue: 205/255, alpha:1).CGColor
emoView.layer.borderWidth = 0.5
emoView.backgroundColor = UIColor(white: 235/255, alpha: 1)
// Emobar setup
emobuttons = StaticData.getEmoButtons()
let unusedSpace = UIScreen.mainScreen().bounds.width - emobuttons.sum {
button in
return button.intrinsicContentSize().width
}
let spaceBetweenButtons = Int(unusedSpace) / (emobuttons.count + 1)
var visualLayout = "H:|"
for button in emobuttons {
button.1.setTranslatesAutoresizingMaskIntoConstraints(false)
visualLayout += "-(space)-[\(button.0)]"
emoView.addSubview(button.1)
button.1.addTarget(self, action: "emoChosen:", forControlEvents: .TouchUpInside)
}
emoView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("\(visualLayout)-(space)-|", options: .AlignAllCenterY, metrics: ["space":spaceBetweenButtons], views: emobuttons))
emoView.addConstraint(NSLayoutConstraint(item: emoView, attribute: .CenterY, relatedBy: .Equal, toItem: emobuttons.values.array.first!, attribute: .CenterY, multiplier: 1, constant: 0))
// Prettify toolbar itself
self.backgroundColor = UIColor.clearColor()
// start hidden
emoView.hidden = true
emoLabel.hidden = emoSelected == nil
}
@IBAction func emoPress(sender: UIButton) {
emoView.hidden = !emoView.hidden
updateEmoLabel()
if !emoView.hidden {
emoLabel.hidden = true
}
}
@IBAction func sendPress(sender: UIButton) {
delegate.sendMessage(textView.text, feeling: emoSelected)
textView.text = ""
emoSelected = nil
sendButton.enabled = false
textViewDidChange(textView)
updateEmoLabel()
}
func emoChosen(sender: UIButton) {
emoView.hidden = true
emoSelected = sender.titleLabel?.text == "🚫" ? nil : sender.titleLabel?.text
updateEmoLabel()
}
func setDraft(draft: String) {
textView.text = draft
}
func updateEmoLabel() {
emoLabel.text = emoSelected
emoLabel.hidden = emoSelected == nil
}
/// MARK: UITextFieldDelegate
func textViewDidChange(textView: UITextView) {
sendButton.enabled = clickableSend
}
}
protocol ConversationToolbarDelegate {
func sendMessage(text: String, feeling: String?)
func hasEnoughCredits() -> Bool
}
最佳答案
我已经用 AutoLayout
解决了这个问题。我添加了一个新的约束来定义我的 UITextField
的高度,我正在 textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText 文本:String) -> Bool
:
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
let oldHeight = textView.frame.height
let newText = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text)
let newSize = (newText as NSString).boundingRectWithSize(CGSize(width: textView.frame.width - textView.textContainerInset.right - textView.textContainerInset.left - 10, height: CGFloat.max), options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: textView.font], context: nil)
let heightChange = newSize.height + textView.textContainerInset.top + textView.textContainerInset.bottom + 2.719 - oldHeight
textFieldHeightLayoutConstraint.constant += heightChange
return true
}
我遇到的问题是我将 AutoLayout
和 UIView.frame
设置为不同的设置,这导致它们发生冲突。
我是个白痴。
关于ios - 调整 inputAccessoryView 中文本字段的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983113/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!