我意识到有许多类似的解决方案,例如TPKeyboardAvoiding,Apple着名的解决方案,以及涉及使用UIScrollView的各种建议.在我的情况下,我需要调整视图大小以适应键盘而不是滚动或移动它.这个解决方案最接近我想要达到的目标,所以这是我的基础.但是我在横向模式下工作时遇到了问题.键盘出现时调整视图大小的方法是:
- (void)keyboardWillShow:(NSNotification *)note {
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[self textField].superview convertRect:[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
CGRect statusBarFrame = [[self textField].superview convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil];
CGRect bounds = [self textField].superview.bounds;
CGRect newFrame = CGRectMake(0.0, 0.0, bounds.size.width, keyboardFrame.origin.y + statusBarFrame.size.height);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
[self textField].superview.frame = newFrame;
} completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
这在肖像模式下完美运行.

但是,在横向模式下,视图会从左到右或从右到左调整大小,具体取决于设备旋转的方向,而不是从下向上.

显然我使用坐标有些不对劲,而且在横向模式下,某些参考框架并不是我认为的那样,但我有一点时间整理出如何解决它.我尝试用-convertRect转换各种各样的东西:但是我正在尝试的任何东西都让我无处可去.
我真的希望有人不会对所有这些矩形感到困惑,以及当方向变化时他们如何改变可以发现我做错了什么以及我需要做些什么才能做到这一点.作为参考,我创建了一个项目,显示了最简单的情况,可以重现我遇到的问题.
最近我们部署了一个新版本的应用程序,从那时起我们就一直看到ActiveRecord的一些非常奇怪的问题.例如,这是一个每天生成数百次的查询片段,通常是正确的:
`entries`.`style` AS t1_r25, `entries`.`pdf_visibility` AS , `entries`.`web_visibility` AS t1_r27
Run Code Online (Sandbox Code Playgroud)
这不是一个错字,t1_r26在那里缺失,虽然它应该是一个空间.但只有那一次.这也不是手工编写的SQL,即ActiveRecord编写查询并决定所有占位符变量.它有类似的拙劣的其他查询留下空白,不应该是空白(甚至不可能),但只是偶尔一次.大部分时间都很好.
我们也看到很多实例抱怨像table_alias或者反射是一个未定义的变量或者假的方法:FalseClass.这是真的......但是FalseClass应该是一个ActiveRecord模型.我们不知道这是怎么发生的,或者我们怎么可能在我们的Rails代码中编写一个错误来完成大部分工作(特别是上面的无效查询).
我们在Rails 4.1.16(我们从4.1.8时开始升级时)升级到乘客5.0.26中的Ruby 2.2.0(接下来是5.0.30).这些错误非常零星,没有任何意义.在每天数千个请求中,只有少数几个请求(5个服务器中少于10个)导致其中一个奇怪的错误,我们不能故意重现它们中的任何一个.
我的整个团队都很难过.我们花了几个小时仔细研究代码更改,看不到任何可能导致任何此类更改的内容.我们甚至不知道我们可能编写的内容会导致ActiveRecord有时以我们不应该影响的方式编写错误的查询.我们不知道如何开始对这种事情进行故障排除.有人在那里有一个提示可能会指出我们有一些有用的方向吗?
更新:这是今天早上扔的一个新的.请注意,LibraryItem是我们非常简单的ActiveRecord模型之一:
NoMethodError: undefined method `__callbacks' for #<LibraryItem:0x007f66cc5b82b0>
Run Code Online (Sandbox Code Playgroud)
我不知道.
我有一个S3存储桶,该存储桶在其策略权限中具有我的CloudFront原始访问身份:
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <mine>"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<my-bucket>/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
另外,我创建了一个组,并将AmazonS3FullAccess托管策略附加到该组,并将IAM用户添加到该组。托管策略如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,当该用户尝试向存储桶添加任何内容时,我收到403(访问被拒绝)。我不确定是否有任何其他操作可行,我还没有编写代码尝试这些操作。仅当我明确在存储桶策略中直接允许该用户的ARN访问存储桶时,才允许他们添加对象。我想念什么?似乎上述组策略应该允许该组的成员访问所有存储桶中的所有操作,但事实并非如此。
编辑:经过大量的文档研究之后,我想我发现Amazon不打算以这种方式使用组。他们希望您改用角色,您可以将角色分配给EC2实例以进行自动凭证管理。很好,但是后来我不知道如何在本地测试我的代码(使用aws-sdk Ruby gem)。亚马逊说要为您的访问ID和密钥定义环境变量-但是什么访问ID和密钥呢?没有这样的角色...
这不是意味着可以控制表单视图内发生的动画吗?我这里有一个 Playground 来演示这个问题,并附有一张发生情况的 gif 动图。如您所见,我在第二个动画视图上的过渡完全被忽略,并且我必须手动放慢视频速度,因为持续时间也被忽略。
我并不是真的想要缩放过渡,这只是为了证明无论我在那里放置什么,动画都是相同的。这是预期的结果,还是一个错误?或者我只是做了一些完全错误的事情?
我也不清楚为什么 VStack 的动画处理方式与简单的文本字段如此不同,后者可以很好地向下滑动,而 VStack 似乎得到了 .move 和 .opacity 的某种组合。
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
@State var showGoodAnimation = false
@State var showBadAnimation = false
var body: some View {
Form {
Toggle(isOn: self.$showGoodAnimation.animation(.easeInOut(duration: 1))) {Text("Yay!")}
if self.showGoodAnimation {
Text("I animate beautifully.")
}
Toggle(isOn: self.$showBadAnimation.animation(.easeInOut(duration: 1))) {Text("Boo!")}
if self.showBadAnimation {
VStack {
Text("Hi.").padding()
Text("I'm a hot mess.").padding()
}
.frame(height: 250)
.transition(.scale)
}
Text("I'm just always here.")
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
Run Code Online (Sandbox Code Playgroud) 我在控制器中有一个方法,它将根据要求返回HTML或JSON.这是一个这种方法的精简示例,模仿我在此问题中找到的有关如何执行此操作的信息:
@RequestMapping(value="callback")
public ModelAndView callback(@RequestParam("c") String c) {
Map response = new HashMap<String, String>();
response.put("foo", "bar");
return new ModelAndView("fake", "data", new JSONPObject(c, response));
}
Run Code Online (Sandbox Code Playgroud)
我将JSONPObject放入模型中,因为我必须能够从呈现是否请求HTML的视图中访问它.但是当我使用回调渲染JSON时,这会产生一个问题:
curl 'http://localhost:8080/notes/callback.json?c=call'
{"data"call(:{"foo":"bar"})}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,因为我将数据放在模型的"数据"插槽中,当模型呈现为JSON时,会有额外的包装.我正在寻找的是渲染的JSON(技术上是JSONP)看起来像这样:
call({"data":{"foo":"bar"}})
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到一种方法来获得我想要去的地方而不会破坏在渲染过程中返回访问JSONPObject的视图的能力吗?