我意识到有许多类似的解决方案,例如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转换各种各样的东西:但是我正在尝试的任何东西都让我无处可去.
我真的希望有人不会对所有这些矩形感到困惑,以及当方向变化时他们如何改变可以发现我做错了什么以及我需要做些什么才能做到这一点.作为参考,我创建了一个项目,显示了最简单的情况,可以重现我遇到的问题.
我正在尝试使我的布局更加横向友好,我有一个常见的模式是添加LinearLayout一些按钮(例如OK |取消),只需设置一个值,layout_weight以便空间均匀分布.问题是,当您在横向模式下使用手机或(特别是)平板电脑时,最终会出现看起来很荒谬的巨大按钮.我尝试设置maxWidth按钮和线性布局,但无济于事.实现这一目标最简单的方法是什么?即,为视图设置最大水平尺寸,使其不会增长到整个宽度.我尝试了很多不同的东西,但都没有用.
这是一个示例布局:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="6dp"
android:paddingBottom="6dp">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:enabled="false"
android:textStyle="bold"
android:text="@string/button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/button2" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
注意:我知道我可以为横向创建一个新的布局文件并在那里做魔术.我想将专门的布局文件保持在最低限度,我希望这不需要它们.
当我呈现仅支持横向的SecondViewController时,第一个UIViewController中的安全区域插入会更改为安全区域插图.
FirstViewController:
class ViewController: UIViewController {
@IBAction func showSecondVC(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
self.present(controller, animated: true, completion: {
print("completed")
})
}
override func viewSafeAreaInsetsDidChange() {
print(view.safeAreaInsets)
super.viewSafeAreaInsetsDidChange()
print(view.safeAreaInsets)
}
}
Run Code Online (Sandbox Code Playgroud)
第二个ViewController:
class SecondViewController: UIViewController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return [.landscape]
}
@IBAction func dismissYourSelff(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
UIEdgeInsets(top: 44.0, left: 0.0, bottom: 34.0, right: 0.0)
UIEdgeInsets(top: 44.0, left: …Run Code Online (Sandbox Code Playgroud) 我在我的活动中使用ExoPlayer,我想要的是在纵向和横向模式下顺利播放视频.为此我正在做的是onpause保存currentPlayerPosition并寻找玩家到那个位置onresume但是在旋转它时面对一个混蛋和视频暂停一段时间并播放到保存的位置.
我的代码如下,请帮助我如何顺利切换模式肖像和风景.谢谢
@Override
public void onPause() {
super.onPause();
if (mExoPlayerView != null && mExoPlayerView.getPlayer() != null) {
mResumeWindow = mExoPlayerView.getPlayer().getCurrentWindowIndex();
mResumePosition = Math.max(0, mExoPlayerView.getPlayer().getContentPosition());
mExoPlayerView.getPlayer().release();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mExoPlayerView.getPlayer() != null)
mExoPlayerView.getPlayer().release();
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_RESUME_WINDOW, mResumeWindow);
outState.putLong(STATE_RESUME_POSITION, mResumePosition);
outState.putBoolean(STATE_PLAYER_FULLSCREEN, mExoPlayerFullscreen);
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
if (mExoPlayerView == null) {
mExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exoplayer);
videoURL = getIntent().getStringExtra("url");
postID = getIntent().getIntExtra("UserID", 0);
String …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用相机.我只是intent用来启动相机
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, 101);
Run Code Online (Sandbox Code Playgroud)
捕获的图像自动进入landscape view.如何camera捕获图像portrait view
android android-camera android-camera-intent landscape-portrait
我知道纯CSS可以根据屏幕尺寸调整样式表,如下所示:
@media (max-width: 959px) {
/* styles for smallest viewport widths */
}
@media (min-width: 600px) and (max-width: 959px) {
/* styles for mid-tier viewport widths */
}
@media (min-width: 960px) {
/* original CSS styles */
}
Run Code Online (Sandbox Code Playgroud)
(来源)
是否可以使用纯CSS来检查横向或纵向显示?
我有一个iPad应用程序,它具有登录屏幕,登录控件包含在UIView中.
当iPad处于纵向时,我在应用程序的底部和中心附近有登录UIView,几乎就在键盘的正上方,公司徽标位于以顶部为中心的UIImageView中.我正在使用AutoLayout约束来保持公司徽标被吸引到顶部和右侧,并且Login UIView被吸引到底部和右侧.
http://chattypics.com/files/ipadportrait_0dzalz3ipx.png
当我将其旋转为横向时,效果如下:
http://chattypics.com/files/ipadlandscape1_j15ps5c95u.png
我希望它看起来像这样
http://chattypics.com/files/ipadlandscape2_sobufqkdhg.png
所以,我希望这两个元素并排,我希望Login UIView更加向右.在纵向模式下,UIView右侧的间距量大于我想要的横向模式,并且距离底部的距离小于我想要的横向模式.我可以通过"容器中心"来处理这个问题,但这在横向模式下也不起作用.
在横向模式中,我使用了这篇文章中详细介绍的技术使事情"并排",但我不相信这就足够了,因为我希望"视图"中的布局在旋转时也是不同的.
我可以想办法以编程方式解决这个问题,但是我无法想象这是一个独特的需求,所以是否有某些方法只使用IB中的约束来解决这个问题?有些"这就是IB中的限制因素设计的方式",可能涉及优先事项?或者我只需要在代码中解决这个问题?
如何将c#中水晶报告的方向更改为横向?我正在纵向使用水晶报告.
我使用以下GradientDrawable作为RelativeLayout的背景:
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="@integer/my_value"
android:endColor="#0FFF"
android:startColor="#FFFF" />
</shape>
Run Code Online (Sandbox Code Playgroud)
然后在res\values文件夹中创建一个名为integers.xml的文件:
<resources>
<integer name="my_value">90</integer>
</resources>
Run Code Online (Sandbox Code Playgroud)
另一个在res\values-land文件夹下具有相同名称的文件:
<resources>
<integer name="my_value">180</integer>
</resources>
Run Code Online (Sandbox Code Playgroud)
因此,当我旋转设备时,梯度从运行Android 2.3.3(如预期)时从底部 - >从上到右 - >左,但是当我在Android 4.4.4上测试时,渐变角度不会改变.
我也尝试过:
<item name="my_value" format="float" type="dimen">90</integer>
Run Code Online (Sandbox Code Playgroud)
但结果相同.
有任何想法吗?
更新:
使用GradientDrawable的RelativeLayout存在于2个不同的文件中:
水库\布局,土地\ my_layout
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/my_drawable" >
Run Code Online (Sandbox Code Playgroud)
更新2:
只有在旋转设备时才会出现问题.如果我使用先前旋转的设备启动活动,则正确设置渐变角度.
我正在制作一个ipad应用程序,我将应用程序设置为仅肖像,但它仍然可以在横向上运行?为什么这只发生在ipad上?我该如何解决?
注意:如果答案是代码,请用swift写.