Навигационная панель rightbaritem ошибка кнопки изображения iOS 11
Этот код работает нормально в ios10. я получаю свой ярлык и кнопку изображения, которая является профилем пользователя, круговым кругом.. ОК. но при запуске симулятора xcode 9 ios11 я получаю его. рамка кнопки должна быть 32x32, при проверке на симулете и получении представления и указании xcode для описания представления я получаю вывод как 170x32 или что-то вроде этого.
Вот мой код.
let labelbutton = UIButton( type: .system)
labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
labelbutton.setTitleColor(UIColor.white, for: .normal)
labelbutton.contentHorizontalAlignment = .right
labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00)
let button = UIButton(type: .custom)
button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
button.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .highlighted)
var buttomItem : UIBarButtonItem = UIBarButtonItem()
buttomItem.customView = button
buttomItem.target = self
buttomItem.action = "ToLogin"
var labelItem : UIBarButtonItem = UIBarButtonItem()
labelItem.customView = labelbutton
labelItem.target = self
labelItem.action = "ToLogin"
if let user = PFUser.current() {
print("LOGIN : checkiando si existe usuario ")
labelbutton.setTitle(USERNAME, for: UIControlState.normal)
labelbutton.sizeToFit()
if(user["profile_photo_url"] != nil) {
print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])")
let photoURL = user["profile_photo_url"] as! String
let a = LoginService.sharedInstance
a.downloadImage(url: photoURL, complete: { (complete) in
if (complete) {
button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal)
button.layer.cornerRadius = 0.5 * button.bounds.size.width
// button.imageView!.contentMode = .scaleAspectFit
// button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
//button.imageView!.contentMode = .scaleAspectFit
//button.imageView!.clipsToBounds = true
//button.imageView!.layer.cornerRadius = 60
button.clipsToBounds = true
self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem]
}
})
} else {
self.NavigationItem.rightBarButtonItem = labelItem
}
print(" EL FRAME DEL BUTTON ES \(button.frame)")
} else {
labelbutton.setTitle("Login", for: UIControlState.normal)
labelbutton.sizeToFit()
self.NavigationItem.rightBarButtonItem = labelItem
}
![введите описание изображения здесь]()
Ответы
Ответ 1
Причина
Проблема возникает из-за того, что из ios 11 UIBarButtonItem
используется автозапуск вместо обращения к фреймам.
Решение
Вы должны добавить ограничение ширины для этой кнопки изображения, если вы используете Xcode 9.
button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true
button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
PS
button
не UIBarButtonItem
, он UIButton
внутри UIBarButtonItem
. Вы должны установить ограничение не для UIBarButtonItem
, а для элементов внутри него.
Ответ 2
Спасибо всем за вклад! вы, ребята, правы!. для xcode9 ios11 вам нужно установить ограничение.
let widthConstraint = button.widthAnchor.constraint(equalToConstant: 32)
let heightConstraint = button.heightAnchor.constraint(equalToConstant: 32)
heightConstraint.isActive = true
widthConstraint.isActive = true
Ответ 3
Ну, новый barButtonItem
использует автозапуск вместо работы с фреймами.
Изображение, добавляемое к кнопке, больше размера самой кнопки. Именно поэтому сама кнопка растянулась до размера изображения. Вы должны изменить размер изображения так, чтобы он соответствовал размеру кнопки, прежде чем добавлять ее к кнопке.
Ответ 4
Код Objective C теперь устарел. Но для пользователя, который должен создавать/поддерживать проекты Objective C в iOS 11, есть перевод из Swift (
Karoly Nyisztor отвечает) Цель Object C полезная.
// UIView+Navbar.h
#import <UIKit/UIKit.h>
@interface UIView (Navbar)
- (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height;
@end
//----------
// UIView+Navbar.m
#import "UIView+Navbar.h"
@implementation UIView (Navbar)
- (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height
{
if (width == 0 || height == 0) {
return;
}
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:height];
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:width];
[heightConstraint setActive:TRUE];
[widthConstraint setActive:TRUE];
}
//----------
// Usage :-
[button applyNavBarConstraints:33 height:33];
Ответ 5
Я написал небольшое расширение для установки ограничений на элементы navbar:
import UIKit
extension UIView {
func applyNavBarConstraints(size: (width: CGFloat, height: CGFloat)) {
let widthConstraint = self.widthAnchor.constraint(equalToConstant: size.width)
let heightConstraint = self.heightAnchor.constraint(equalToConstant: size.height)
heightConstraint.isActive = true
widthConstraint.isActive = true
}
}
// Usage
button.applyNavBarConstraints(size: (width: 33, height: 33))
Ответ 6
Я сделал это объективно, используя следующие строки:
NSLayoutConstraint * widthConstraint = [customButton.widthAnchor constraintEqualToConstant:40];
NSLayoutConstraint * HeightConstraint =[customButton.heightAnchor constraintEqualToConstant:40];
[widthConstraint setActive:YES];
[HeightConstraint setActive:YES];
UIBarButtonItem* customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];
self.navigationItem.leftBarButtonItem = customBarButtonItem;
Спасибо Счастливое кодирование!
Ответ 7
Что я сделал?
В моем приложении я добавил изображение профиля в navigationBar в элементе rightBarButton. перед iOS 11 он работал хорошо и отображался правильно, но когда он обновлен до iOS 11, измените поведение, например, удар
![введите описание изображения здесь]()
Итак, я добавил UIView
в элемент правой кнопки и установил UIButton
как подпункт UIView
? Как ниже,
![введите описание изображения здесь]()
И я устанавливаю ограничения высоты и ширины UIButton
.
![введите описание изображения здесь]()
И моя проблема решена. Не забудьте установить цвет фона UIView
как цвет очистить.
ПРИМЕЧАНИЕ. Если ваша кнопка не будет работать, проверьте, что высота UIView's
может быть 0 здесь, вы должны изменить высоту 0 на 44 или что угодно. А также clipToBound = true
, теперь вы можете установить свою позицию на кнопке, и она будет хорошо работать.
Ответ 8
Несмотря на то, что в iOS 11 используется Autolayout для панели навигации, можно заставить ее работать традиционно, устанавливая фреймы. Вот мой код для ios11 и ios10 или старше:
func barItemWithView(view: UIView, rect: CGRect) -> UIBarButtonItem {
let container = UIView(frame: rect)
container.addSubview(view)
view.frame = rect
return UIBarButtonItem(customView: container)
}
и вот как состоит элемент заголовка:
let btn = UIButton()
btn.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal)
btn.tintColor = tint
btn.imageView?.contentMode = .scaleAspectFit
let barItem = barItemWithView(view: btn, rect: CGRect(x: 0, y: 0, width: 22, height: 22))
return barItem
Ответ 9
Ввод ограничений, программно сработанных для меня для пользователей, работающих под управлением iOS 11.X. Тем не менее, кнопка панели все еще была растянута для пользователей, работающих под управлением iOS 10.X. Я думаю, что рецензенты AppStore запускали iOS 11.X, поэтому не удалось определить мою проблему, поэтому мое приложение готово для продажи и загрузки..
Мое решение состояло в том, чтобы просто изменить размеры изображения на 30x30 в другом программном обеспечении (предыдущее измерение изображения было 120x120).
Ответ 10
Изменение widthAnchor
/heightAnchor
будет работать только на устройствах iOS 11+. Для устройств iOS 10 вам нужно перейти классическим способом ручной смены кадров. Дело в том, что ни один из двух подходов не работает для обеих версий, поэтому вам абсолютно необходимо программно чередовать в зависимости от версии исполнения, например ниже:
if #available(iOS 11.0, *)
{
button.widthAnchor.constraint(equalToConstant: 32.0).isActive = true
button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
}else
{
var frame = button.frame
frame.size.width = 32.0
frame.size.height = 32.0
button.frame = frame
}
Ответ 11
У меня также был успех, реализовав intrinsicContentSize
, чтобы вернуть соответствующий размер для любого пользовательского подкласса UIView, который я намерен использовать в качестве customView.